mod_rewrite urlencoding 一个已经 urlencoded 的查询字符串参数 - 有啥方法可以禁用它?

Posted

技术标签:

【中文标题】mod_rewrite urlencoding 一个已经 urlencoded 的查询字符串参数 - 有啥方法可以禁用它?【英文标题】:mod_rewrite urlencoding an already urlencoded query string parameter - any way to disable this?mod_rewrite urlencoding 一个已经 urlencoded 的查询字符串参数 - 有什么方法可以禁用它? 【发布时间】:2011-09-25 02:47:56 【问题描述】:

我们有一些非常基本的 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 自行重新编码查询字符串参数

所以用户最终得到的是:

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

重定向到

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

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

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

something.swf (no query string)

something.swf?someparams...

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

【问题讨论】:

哇!答案是NE参数。对不起! 是的。您能否提供答案并将其标记为已接受? (我想这样做是有时间限制的,但请尽快:P) 是的,我需要 100 个代表在不到 8 小时内回答我自己的问题。稍后再回答。 Apache2 redirect with query string escaped twice 的可能重复项 【参考方案1】:

实现这一点的方法是通过 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 保留所有查询字符串值,而不进行任何编码/转义。

就这么简单:)

【讨论】:

实际上可能存在与此相关的错误。 NE 是一个不错的选择,除非您在 URL 的路径段中也有 URL 编码字符。见:serverfault.com/questions/331899/… 在此处删除标志的文档链接以供未来读者使用:httpd.apache.org/docs/2.4/rewrite/flags.html#flag_ne

以上是关于mod_rewrite urlencoding 一个已经 urlencoded 的查询字符串参数 - 有啥方法可以禁用它?的主要内容,如果未能解决你的问题,请参考以下文章

apache mod_rewrite 模块未安装

mod_rewrite:如何重定向 HTTP DELETE 和 PUT

mod_rewrite

mod_alias 与 mod_rewrite 优先级

mod_rewrite 不在 XAMPP 上执行特定重定向 - 与 DirectoryIndex 冲突?

Apache mod_rewrite 不保留名称