mod_rewrite urlencoding一个已经urlencoded查询字符串参数 - 任何方法来禁用它?

时间:2011-06-29 12:16:19

标签: apache mod-rewrite

我们有一些非常基本的mod_rewrite规则:

RewriteRule ^something.swf$ http://www.newdomain.com/something.swf [R=302,L]

mod_rewrite似乎完成了它的工作,如果用户正在访问:

something.swf?param=value,它被正确地重定向到http://www.newdomain.com/something.swf?param=value

问题出在这种情况:

www.olddomain.com/something.swf?param=URL_ENCODED_VALUE

最终发生的事情是mod_rewrite将它自己重新编码查询字符串param

所以用户最终得到的是:

www.olddomain.com/something.swf?param=URL_ENCODED_VALUE

重定向

www.newdomain.com/something.swf?param=URL_ENCODED_VALUE_OF_URL_ENCODED_VALUE

所以我们最终得到了一个双urlencoded值。 boourns!

虽然我明白我们可以为此制定一个\?(.*) ... ?$1规则,但我认为必须有一种方法可以告诉mod_rewrite不要urlencode查询字符串参数...我们我希望避免使用2条规则,因为有效路径是:

something.swf (no query string)

something.swf?someparams...

所以是的,理想情况下...告诉mod_rewrite:请不要查询字符串参数的urlencoding ...只需通过R=302直接转到新网址。

1 个答案:

答案 0 :(得分:98)

实现这一目标的方法是通过NE(无逃脱)参数。

RewriteRule ^something.swf$ http://www.newdomain.com/something.swf [R=302,L]

实际上应该阅读

RewriteRule ^something.swf$ http://www.newdomain.com/something.swf [R=302,NE,L]

这会强制mod_rewrite保留所有查询字符串值,而不进行任何编码/转义。

就这么简单:)