在传递查询字符串时,我们遇到了 Apache mod_rewrite 行为的一个奇怪的问题(可能是一个错误?)。
为了重现此问题,我们安装了一个干净的 Ubuntu (oneiric),并使用默认的 Apache 配置。我们启用了 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}}
然而,这意味着我们无法区分查询字符串中的
&
和转义的。&
更新:
此错误报告描述了相同的问题。第一条评论链接到一个似乎修复了该问题的提交,但正如 Pieter 在下面所说,它似乎并没有真正得到修复。
答案1
这似乎是 Apache 的一个错误。此错误报告有点混乱,但准确描述了您的问题:
https://issues.apache.org/bugzilla/show_bug.cgi?id=34602
看起来他们已经意识到了这个问题。虽然他们声称已经修复了该错误,但我使用 Apache 2.3.15 测试了该错误,问题似乎仍然存在。另外请注意,Apache 2.3 是一个测试版本,因此即使它确实修复了该错误,在 Apache 2.4 发布之前对你来说也是没用的。