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 的查询字符串参数 - 有啥方法可以禁用它?的主要内容,如果未能解决你的问题,请参考以下文章
mod_rewrite:如何重定向 HTTP DELETE 和 PUT