自定义404页面 - PHP

12

我有一个自定义的404页面,除了我想要在页面上显示的信息之外,其他都正常工作。

我希望它能够显示无法找到的页面的URL,但实际上它显示了404页面的URL。

这是我的代码...

您正在查找 <?php echo $ _SERVER ['REQUEST_URI']?>

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


2
你是如何设置错误页面的?(例如,你是使用了Apache的ErrorDocument指令还是其他的方式?) - John Parker
我有一个带有以下行的htaccess文件:ErrorDocument 404 /404/ - 而404页面包含了上述行。 - Tom
1
你能否在出现这种行为的实例中发布 <?php var_dump($_SERVER); ?> 的内容?我很困惑为什么这些方法都不起作用。我尝试了一下 Apache,却无法产生一个完全不得到想要结果的情况。 - Simon
@Simon143 - 感谢你的建议。看起来我需要使用DOCUMENT_URI。虽然正如你所说,我真的希望我的原始代码能够工作。很奇怪!! - Tom
5个回答

12

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

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

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

更新:

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

对于两种情况,请注意像$_POST$_GET和其他内容一样,任何标头都同样容易受到恶意内容的攻击,因此在输出内容之前请先处理它们。

更新2:

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


1
不能保证这个会被提供,因为它是从浏览器发送的HTTP头部。(实质上,应该有一个确保在服务器端解决这个问题的解决方案。) - John Parker
3
别忘了进行一些转义操作。从技术上讲,引荐者是用户输入的内容。 - svens

7

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


1
我原以为这会起作用,但事实并非如此...仍然显示404页面的URL(例如404.php)。 - Tom

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()); ?>

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

我不会将它们重定向,而是直接在未找到页面上显示404。请查看我在原帖中的评论以获取htaccess代码。 - Tom

0
使用 `file_exists` 函数来检查用户要查找的文件是否存在,如果不存在,则将其重定向到自定义的错误页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接