(哇,这个标题太烂了......如果您有更好的标题,请随意在评论中提出建议或编辑它。)
我有一台带有 CGI 程序的服务器,该程序接收 URL 作为路径信息,检查用户的 IP 地址,并将他们重定向到直接转到该 URL(如果他们是我们组织的内部用户)或通过代理将他们发送到该 URL(如果他们是外部用户)。CGI 本身运行良好,但有些 URL 会让 apache 返回 404 Not Found 错误,而不是调用脚本。这似乎与包含 URI 编码路径的目标 URL 有关。例如,
http://myserver.org/cgi-bin/ipchk/http://other.server.org/10.1007%2F3-540-28519-9_8
返回 404,而
http://myserver.org/cgi-bin/ipchk/http://other.server.org/10.1007/3-540-28519-9_8
(相同的 URL,但%2F
解码为/
)可以正常工作。
我已经验证过(通过error_log
在启动时输出)当返回 404 时,脚本ipchk
根本没有启动。这些错误肯定来自 apache 本身,而不是脚本将用户重定向到不存在的 URL 导致的。
为什么 pathinfo-URL 的编码会影响 apache 定位 ipchk 脚本的能力以及我需要做什么才能让它通过全部 /cgi-bin/ipchk/
URIipchk
不管后面跟着什么?
答案1
为了保护用户免受在检查传入路径之前未正确解码数据的 CGI 代码的侵害,apache 拒绝(作为 404 Not found)包含 URI 编码形式的正斜杠 ( %2F
) 或反斜杠 ( %5C
) 的 URL,如下所述在本文中。
要绕过此检查,您必须使用 apache 2.0.46 或更高版本,并启用AllowEncodedSlashes
Apache 配置中的指令。(该指令不是工作.htaccess
;它仅允许在服务器或虚拟主机上下文中工作。)