前不久运营提出一个需求,关于301转定向,我想都不想直接丢给下面的妹子去处理,结果弄了2天没什么消息,闲话不多说,拿案例说话:
需求:
老地址:offer.csc86.com/buy/categoryOne.html?categoryId=*? //一级类目地址
offer.csc86.com/buy/category.html?categoryId=*? //二级三级级类目地址
新类目地址形式offer.csc86.com/id.html
abc.domain.com/sort/2=>abc.domain.com/index.php?act=sort&name=abc&id=2;
if($host ~* (.*)\.domain\.com){
set $sub_name $1;
rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sun_name&in=$1 last;
}
这个案例说(事后仔细查看,这案例很坑,是错的,但是格式和思路是正确的),结果到了下午我自己就写了一个
rewrite ^/buy\/category(.*)\.html\?categoryId=(\w*)(\&?)(.*)$ /$2\.html\? permanent;
第一个(.*) 匹配categoryOne或者category(并不是很严谨的),(\w*)为参数值,(\&?),匹配可能为多参数,第二个(.*)匹配更多可能出现的更多参数。
可以能是当时自我测试不认真(或者是其它因素)还真是通过了,我毫不犹豫的发了下去,结果发现项目进度还是卡住,
经过了解,这段解析没有任何作用.
当时就特别郁闷,没理由都是很符合规范的啊,这时候主管插手了这一事情,用其它的方式写了一个
if ($request_uri ~* "^/buy\/category\.html\?categoryId=([a-z0-9\-]{1,36})(&?)(.*)"){
set $cate $1;
set $args $3;
rewrite ^/.*$ http://$host/$cate.html permanent;
}
if ($request_uri ~* "^/buy\/categoryone\.html\?categoryId=([a-z0-9\-]{1,36})(&?)(.*)$"){
set $cate $1;
set $args $3;
rewrite ^/.*$ http://$host/$cate.html permanent;
}
用$args进行处理,实现成功.然后我还是很郁闷为什么我写的那段匹配未执行,问了几个大神级别人物,给我的答复
这段是很正确的没有问题.
可是实际情况表明,真心没有执行啊,然后我又去掉参数进行实验,发现我写的那种方式在没有参数的情况下是完全OK的,
这下就十分疑惑了,随着翻了基本nginx的书,还是没有找到我想要的答案,唯一的得出的是,书上的所有rewrite事列都是不带参数的,然后在
最后简短的有一个request_uri的小事列用$args匹配参数.
随后实在没办法还是稍微改了一下主管的方法:
if ($request_uri ~* "^/buy\/category(.*)\.html\?categoryId=([a-z0-9\-]{1,36})(&?)(.*)"){
set $cate $2;
set $args $4;
rewrite ^/.*$ http://$host/$cate.html permanent;
}
rewrite ^/buy\/category(.*)\.html\?categoryId=(\w*)(\&?)(.*)$ /$2\.html\? permanent;
目前我的自我总结是rewrite 不能直接处理有参数的URL(是&?这种形式的参数, /2/2/3这种形式的是没问题的),求大神指点,
现在没时间弄了,哪天懂了会上来写明!