自定义404页面 - PHP

时间:2011-04-14 12:47:26

标签: php apache http-status-code-404 errordocument

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

我希望它能说出无法找到的网页的网址,而是显示404网页的网址。

这就是我所拥有的......

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

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

5 个答案:

答案 0 :(得分:12)

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

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

在网站配置中使用Apache的ErrorDocument 404 /handle404.php.htaccess意味着$_SERVER['REQUEST_URI']实际上会有效,但下面的更新中提供了更强大的解决方案。

更新

显然$_SERVER['REDIRECT_URL']可能是一个更好的选择,但搜索了一下。

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

更新2:

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

答案 1 :(得分:7)

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

答案 2 :(得分: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()); ?>

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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