12

我有一个自定义 404 页面,除了我想在此页面上显示的消息外,它工作正常。

我希望它说出无法找到的页面的 url,而是显示 404 页面的 url。

这就是我所拥有的...

You were looking for <?php echo $_SERVER['REQUEST_URI'] ?>.

htaccess 文件包含以下行:ErrorDocument 404 /404/

4

5 回答 5

12

您需要改为使用$_SERVER['HTTP_REFERER']- 这将是他们首先请求的地址。

这仅适用于问题中描述的确切情况 - 浏览器实际上已被重定向到404 页面。在这种情况下,$_SERVER['REQUEST_URI']包含 404 页面的 URI,而不是描述的最初请求的页面。

ErrorDocument 404 /handle404.php在站点配置中使用 Apache或者.htaccess意味着这$_SERVER['REQUEST_URI']实际上可以工作,但更强大的解决方案是下面更新中的选项。

更新:

$_SERVER['REDIRECT_URL']然而,经过一番搜索,显然可能是一个更好的选择。

$_POST正如下面评论者所提到的,对于这两种情况,请记住,任何标头都与,和其他标头一样容易出现恶意内容$_GET,因此请在输出任何内容之前对其进行处理。

更新 2:

没有看到下面@Janoz 的帖子 - 他正确地提到了REDIRECT_URL.

于 2011-04-14T12:49:30.347 回答
7

从 php 页面的角度来看,这确实是请求 uri。显示错误页面由网络服务器完成。例如 Apache 将添加一些额外的服务器变量。REDIRECT_URL 可能是您正在寻找的那个。

于 2011-04-14T12:52:41.070 回答
1

我没有写这个函数,但它是我用来做同样事情的:

    function selfURL() {
    $s = empty($_SERVER["HTTPS"]) ? ''
        : ($_SERVER["HTTPS"] == "on") ? "s"
        : "";
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s;
    $port = ($_SERVER["SERVER_PORT"] == "80") ? ""
        : (":".$_SERVER["SERVER_PORT"]);
    return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];
}
function strleft($s1, $s2) {
    return substr($s1, 0, strpos($s1, $s2));
}

然后打印它:

<?php print(selfURL()); ?>
于 2011-04-22T15:46:54.597 回答
0

使用 file_exists 检查您的用户正在查找的文件是否存在。如果它没有将它们重定向到自定义错误页面。

于 2011-04-20T10:08:23.427 回答
0

如果页面不存在,您将他重定向到 404 页面?理想情况下,我会直接在未找到的页面上显示 404。这样,您不必重定向,并且可以正确使用 REQUEST_URI。而且您的 404 代码仍然可以集中!

于 2011-04-14T13:00:43.407 回答