如何防止Apache在URL路径中将双斜杠缩减为单斜杠?

4

Apache有一个非常烦人的习惯,会将URL中的双斜杠替换为单个斜杠。

例如:

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

当我查看这个URL时,它已经被Apache修改成了:

$_SERVER['PATH_INFO']; 

如果使用 var,路径信息将显示为:

foo/bar

替代

foo//bar

有人知道解决方法吗?我认为这个问题是内在于apache的功能中...我不知道是否可以通过调整某种apache标志来禁用此行为。


2
为什么要保留双斜杠?...而且我很确定是浏览器修复了它,因为这是一个无效的URL... - Erik
@Erik 不是浏览器的问题。URL 并不无效。在这种情况下,双斜杠是 附加路径信息 (PATH_INFO) 的一部分 - 即跟随现有(有效)URL 的 URL 的一部分。 - MrWhite
3个回答

1

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

< p > /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,仅保留路径信息(如果有的话)。您可以使用REQUEST_URI代替PHP_SELF,但是这将包括查询字符串,因此您需要进行检查。
因此,对于上述请求,其中SCRIPT_NAME为“/myscript.php”,PHP_SELF为“/myscript.php/foo//bar”,则结果为$pathInfo是“/foo//bar”。

0

nginx有一个merge_slashes指令,允许斜杠合并以匹配位置,并默认为关闭状态,这意味着默认情况下不会合并。如果在RFC中指定了合并行为,那么nginx肯定没有遵循。


0

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

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


1
恩,我就怕答案会是那样...哎呀,算了。很烦人。 - Eugene
你可以转义字符 / 并将其替换为 ASCII 值,参见 urlencode()。 - Maks3w

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接