2012-09-13 64 views
4

Apache有一个非常恼人的倾向,用单一URL替换URL中的双斜杠。如何防止apache在URL路径中使用单斜杠减少双斜线?

例子:

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

当我看

$_SERVER['PATH_INFO']; 

变种,路径信息将显示为:

foo/bar 

,而不是

foo//bar 

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

+2

为什么要保留双斜杠? ...另外我很确定这是浏览器修复它,因为它无效的网址... – Erik

+0

@Erik不是浏览器。该网址无效。此实例中的双斜杠是_additional path information_(PATH_INFO)的一部分,它是跟踪现有(有效)URL的URL部分。 – MrWhite

回答

0

它是解析URI的RFC标准的一部分,所以你不能改变它。

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

+0

呃,我很害怕答案会是这样的......哦,好吧。烦人。 – Eugene

+0

你可以转义字符/并将其替换为ASCII值,请参阅urlencode() – Maks3w

+0

是的,这是我要去的路线... – Eugene

0

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

0

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,留下路径信息(如果任何)。你可以使用REQUEST_URI而不是PHP_SELF,但是这包括查询字符串,所以你需要检查这个。

因此,鉴于上述要求,其中SCRIPT_NAME是“/myscript.php”和PHP_SELF是“/myscript.php/foo//bar”,然后将所得$pathInfo是“/富//栏”。

相关问题