小编Eri*_*ink的帖子

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

我们在传递查询字符串时遇到了 Apache mod_rewrite 行为的一个奇怪问题(也许是一个错误?)。

为了重现,我们使用默认的 Apache 配置设置了一个干净的 Ubuntu (oneiric) 安装。我们启用了 mod_rewrite,并且在默认站点配置中,我们添加了以下内容:

RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]
Run Code Online (Sandbox Code Playgroud)

为了测试,我们使用 curl:

curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'
Run Code Online (Sandbox Code Playgroud)

相关输出是:

HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b
Run Code Online (Sandbox Code Playgroud)

如您所见,查询字符串被双重转义,这是错误的。有谁知道我们如何解决这个问题?我们尝试了几件事:

  • 添加 [NE]。这为我们提供了正确的查询字符串,但路径未转义,这会导致新问题。
  • 添加 [NE,B]。这似乎有效,但会导致路径/ab部分之间被转义。
  • 手动取消转义查询字符串。

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    
    Run Code Online (Sandbox Code Playgroud)

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

更新:

此错误报告描述了相同的问题。第一条评论链接到一个明显解决问题的提交,但正如 Pieter 在下面所说的,它似乎并没有真正修复。

mod-rewrite escaping querystring apache-2.2

13
推荐指数
1
解决办法
6398
查看次数

标签 统计

apache-2.2 ×1

escaping ×1

mod-rewrite ×1

querystring ×1