4

Apache 有一种非常讨厌的倾向,即用单斜杠替换 URL 中的双斜杠。

例子:

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

当我看着

$_SERVER['PATH_INFO']; 

var,路径信息将显示为:

foo/bar

代替

foo//bar

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

4

3 回答 3

1

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

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

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”。

于 2017-02-12T22:35:30.307 回答
0

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

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

于 2012-09-13T19:04:23.660 回答
0

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

于 2014-03-07T23:26:52.160 回答