如何防止apache在URL路径中使用单斜杠减少双斜杠?

时间:2012-09-13 19:01:38

标签: php apache url path

Apache有一个非常烦人的倾向,用一个单独的URL替换双斜杠。

示例:

请求网址:http://example.com/myscript.php/foo//bar

当我看

$_SERVER['PATH_INFO']; 

var,路径信息将显示为:

foo/bar

而不是

foo//bar

有没有人知道修复此问题?我相信这在apache的功能中根深蒂固......我不知道是否有某种apache标志可以调整以禁用此行为。

3 个答案:

答案 0 :(得分:1)

  

http://example.com/myscript.php/foo//bar

/foo//bar是实际文件名后面的附加路径信息。虽然Apache确实减少了PATH_INFO服务器变量中的多个斜杠(传递给相应的PHP超全局),但原始URL(带有多个斜杠)仍然可以在$ _SERVER ['PHP_SELF']变​​量中使用。

因此,不是通过PATH_INFO变量访问路径信息,而是可以执行以下操作:

$pathInfo = str_replace($_SERVER['SCRIPT_NAME'],'',$_SERVER['PHP_SELF']);

这只是从PHP_SELF中删除了SCRIPT_NAME,而保留了 path-info (如果有的话)。您可以使用REQUEST_URI而不是PHP_SELF,但这包括查询字符串,因此您需要检查此内容。

因此,根据上述请求,SCRIPT_NAME为“/myscript.php”而PHP_SELF为“/myscript.php/foo//bar”,结果为$pathInfo是“/ foo // bar”。

答案 1 :(得分:0)

它是解析URI的RFC标准的一部分,因此您无法更改它。

甚至可能您的浏览器会在将请求发送到远程服务器之前规范化URI。

答案 2 :(得分:0)

nginx有一个merge_slashes指令,允许合并斜杠以匹配一个位置,默认为off,这意味着它默认不合并。如果在RFC中指定了合并行为,则肯定不会遵循nginx。