早前遇到的rewrite需求很简单,一般就是把访问某个站点url的请求,rewrite到另外一个url上,访问原站点下的其他文件则不作处理,如下:
if ($host ~* ^(yueli)\.example\.cn) {
rewrite ^/$ permanent;
}
但最近接到一个需求比较复杂,要求如下:
, rewrite 为:bbs.example.com/post-3-4.shtml(数字对应);
……
诸如此类的有好几个,都是同域名下不同的虚拟目录的url,rewrite到不同的url下;
思考并测试了好一段时间,得出的配置方法如下:
if ($host ~* ^(www)\.example\.cn) {
rewrite /forum//(\d+)/(\d+)\.shtml permanent;
rewrite /city/(\w+)/(\w+)\.shtml permanent;
}
测试rewrite效果正确;
但随后业务又提出一个很蛋疼的要求:之前由于一些技术上的疏忽,在开放给用户的url中,可能有部分字母为大写,比如:
而linux对大小写要求很严格,如果按照上述规则,那么当用户通过收藏的方式访问含有大写字母的url时,跳转就会出错,因此要求做大小写兼容;
好吧,那把判断规则改成这样:
if ($host ~* ^(www)\.example\.cn) {
rewrite /(F|f)orum//(\d+)/(\d+)\.shtml permanent;
rewrite /(C|c)ity/(\w+)/(\w+)\.shtml permanent;
}
测试配置文件合法性,通过;
但上线测试跳转时,出现了问题:
访问 ,现在会跳到 ,而非我们所希望的:bbs.example.com/post-3-4.shtml,仔细看了一下才明白,原来nginx把(F|f)当做是第一个变量匹配了,于是修改的规则最终正确版本如下:
if ($host ~* ^(www)\.example\.cn) {
rewrite /(F|f)orum//(\d+)/(\d+)\.shtml permanent;
rewrite /(C|c)ity/(\w+)/(\w+)\.shtml permanent;
}
阅读(1162) | 评论(0) | 转发(0) |