1
Apache mod_rewrite在重定向时对查询字符串进行双重编码
在通过查询字符串传递时,Apache mod_rewrite的行为遇到了一个奇怪的问题(也许是错误?)。 为了进行复制,我们使用默认的Apache配置设置了一个全新的Ubuntu(oneiric)安装。我们启用了mod_rewrite,并且在默认站点配置中,添加了以下内容: RewriteEngine on RewriteRule ^/(.*)$ /r/$1 [R] 为了测试,我们使用curl: curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b' 相关输出为: HTTP/1.1 302 Found Server: Apache/2.2.20 (Ubuntu) Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b 如您所见,查询字符串是两次转义的,这是错误的。有谁知道我们如何解决这个问题?我们尝试了几件事: 添加[NE]。这为我们提供了正确的查询字符串,但是路径未转义,从而导致新的问题。 添加[NE,B]。这似乎是工作,但引起/的之间a并b路径部分转义。 手动取消转义查询字符串。 RewriteCond %{QUERY_STRING} .* RewriteMap unescape int:unescape RewriteRule ^(.*)$ $1?${unescape:%{QUERY_STRING}} 但是,这意味着我们无法区分查询字符串中的“ an” &和“转义&”。 更新: 此错误报告描述了相同的问题。第一条评论与一个显然可以解决该问题的提交有关,但是正如Pieter在下面说的那样,它似乎并没有得到真正的解决。