Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30881
  • 博文数量: 8
  • 博客积分: 189
  • 博客等级: 入伍新兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-10 23:02
文章分类
文章存档

2013年(1)

2012年(1)

2011年(6)

我的朋友

分类: 系统运维

2013-01-08 18:01:54

早前遇到的rewrite需求很简单,一般就是把访问某个站点url的请求,rewrite到另外一个url上,访问原站点下的其他文件则不作处理,如下:
   if ($host ~* ^(yueli)\.example\.cn) {
     rewrite ^/$ permanent;
   }
 
但最近接到一个需求比较复杂,要求如下:
, rewrite 为:bbs.example.com/post-3-4.shtml(数字对应);
www.example.com/city/content/blog.shtml, rewrite 为:bbs.example.com/list-content-blog.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) |
0

上一篇:WSUS目录本地迁移

下一篇:没有了

给主人留下些什么吧!~~