在通过查询字符串传递时,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在下面说的那样,它似乎并没有得到真正的解决。