如何在查询参数上使用mod_rewrite退出重定向循环?

时间:2013-01-30 20:27:25

标签: mod-rewrite url-rewriting url-redirection

我需要根据查询字符串实现重定向规则。查询字符串将 包含四个参数但它们可以采用可变位置,例如

www.a.com/whatever?w=1&x=2&y=3&z=india_en
www.a.com/whatever?x=2&w=1&y=3&z=india_en

将被重定向到

www.a.com/whatever?x=2&w=1&y=3&z=a006

除此之外,我需要检查另一个参数sid。如果查询字符串中存在sid,则不会发生重定向。

我已经按照以下方式编写了重定向规则(当然第一部分):

RewriteCond %{QUERY_STRING} ^w=(.*)$
RewriteRule ^(.*)$ - [E=MY_W:w=%1] [NC,C]
RewriteCond %{QUERY_STRING} ^x=(.*)$
RewriteRule ^(.*)$ - [E=MY_X:x=%1] [NC,C]
RewriteCond %{QUERY_STRING} ^y=(.*)$
RewriteRule ^(.*)$ - [E=MY_Y:y=%1] [NC]
RewriteCond %{QUERY_STRING} ^z=india_en$
RewriteRule ^(.*)$ - [E=MY_Z:z=a006] [C]
RewriteRule ^(/whatever)$ http://www.a.com$1?%{ENV:MY_W}&%{ENV:MY_X}&%{ENV:MY_Y}&%{ENV:MY_Z} [L,R=permanent]

但是我得到的重定向循环最后有无数的&符号,如

输入: http://www.a.com/whatever?w=1&x=2&y=3&z=india_en

输出 http://www.a.com/whatever?w=1&x=2&y=3&z=india_en&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

如何摆脱这种循环?

1 个答案:

答案 0 :(得分:0)

#don't rewrite if parameters are already in the right order
RewriteCond %{QUERY_STRING} ^w=(.*)x=(.*)y=(.*)z=(.*)$
RewriteRule .* - [L]

RewriteCond %{QUERY_STRING} ^w=(.*)$
RewriteRule ^(.*)$ - [E=MY_W:w=%1] [NC,C]
RewriteCond %{QUERY_STRING} ^x=(.*)$
RewriteRule ^(.*)$ - [E=MY_X:x=%1] [NC,C]
RewriteCond %{QUERY_STRING} ^y=(.*)$
RewriteRule ^(.*)$ - [E=MY_Y:y=%1] [NC]
RewriteCond %{QUERY_STRING} ^z=india_en$
RewriteRule ^(.*)$ - [E=MY_Z:z=a006] [C]
RewriteRule ^(/whatever)$ http://www.a.com$1?%{ENV:MY_W}&%{ENV:MY_X}&%{ENV:MY_Y}&%{ENV:MY_Z} [L,R=permanent]