$ _SERVER ['PHP_SELF']间歇性地返回两个前导斜杠

时间:2010-12-14 17:17:35

标签: php

为什么$ _SERVER ['PHP_SELF']在一个实例中返回一个文件名/test/foo.bar,另一个实例(从同一个php脚本执行)返回//test/foo.bar(带有双前导斜杠) )?

form.php将$ _GET发送到login.php。 login.php重定向到

header ('Location: test/foo.bar')

foo.bar包括:

$page = filter_var($_SERVER['SCRIPT_NAME'], FILTER_SANITIZE_STRING);

此外,我无法按需复制它。

3 个答案:

答案 0 :(得分:1)

$_SERVER['PHP_SELF']的值取决于客户端发送的实际请求。 Apache允许目录名之间有多个斜杠,因此它将http://example/foo.php视为与http://example//foo.php相同 - 两者都将调用foo.php,但请求URI将包含客户端请求的任何内容。

如果您的脚本只需要一个斜杠,则必须手动剥离剩余的斜杠。

答案 1 :(得分:1)

我猜你是在某个地方用代码构建链接(或者某人只是在某个地方输入了一个额外的斜杠)。您可能会在这些行中包含一些代码:

function buildLink($site, $relPath, $text) {
    return "<a href=\"$site/$relPath\">$text</a>";
}

如果在某些情况下使用尾部斜杠传入$site,则在删除服务器名称时最终会得到前导双斜杠。或者,如果传入绝对路径。额外的斜杠不会影响显示哪个页面,但它仍会显示在已解析的URL中。

答案 2 :(得分:0)

您可以尝试使用$ _SERVER ['SCRIPT_NAME']。请注意,PHP_SELF容易受到一些类型的攻击,因此在使用它时要小心。您必须将其视为用户提供的输入。