Apache mod_rewrite在重定向时对查询字符串进行双重编码


13

在通过查询字符串传递时,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]。这似乎是工作,但引起/的之间ab路径部分转义。
  • 手动取消转义查询字符串。

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    

    但是,这意味着我们无法区分查询字符串中的“ an” &和“转义&”。

更新:

此错误报告描述了相同的问题。第一条评论与一个显然可以解决该问题的提交有关,但是正如Pieter在下面说的那样,它似乎并没有得到真正的解决。

Answers:


7

这似乎是Apache中的错误。此错误报告有点混乱,但准确描述了您的问题:

https://issues.apache.org/bugzilla/show_bug.cgi?id=34602

看来他们已经意识到了这个问题。尽管该错误声称已修复,但我已经用Apache 2.3.15对其进行了测试,但问题似乎仍然存在。还要注意,Apache 2.3是一个beta版本,因此即使它确实修复了它也对您没有用,直到Apache 2.4发布。


似乎Apache 2.4.10仍在执行此操作,尽管它应该已在2.4.1中修复
Arjan 2015年

1
我仍然看到问题2.4.7
弗朗索瓦·
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.