如何使用 PHP 创建错误 404 页面?
Posted
技术标签:
【中文标题】如何使用 PHP 创建错误 404 页面?【英文标题】:How to create an error 404 page using PHP? 【发布时间】:2010-11-25 18:02:15 【问题描述】:我的文件.htaccess
处理从/word_here
到我的内部端点/page.php?name=word_here
的所有请求。 PHP 脚本然后检查请求的页面是否在其页面数组中。
如果不是,如何模拟404错误?
我试过这个,但它并没有导致我通过 ErrorDocument
在 .htaccess
中配置的 404 页面出现。
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
我是否认为重定向到我的错误 404 页面是错误的?
【问题讨论】:
为什么说它不起作用?你检查服务器响应头了吗? 在回答您的结论性问题时,是的,将所有 404 重定向到真实页面是个坏主意。这违反了 HTTP 规范,将不应该存在的东西变成了存在的东西。 【参考方案1】:生成 404 页面的最新答案(PHP 5.4 或更高版本)是使用http_response_code
:
<?php
http_response_code(404);
include('my_404.php'); // provide your own html for the error page
die();
die()
不是绝对必要的,但它确保您不会继续正常执行。
【讨论】:
我应该在哪个文件中添加这个? @Julfikar 在您希望从中返回 404 响应的 php 文件中。例如,您的 php 文件可能具有试图从数据库中检索指定 id 的逻辑。没找到?向用户返回 404“抱歉,找不到 ID”响应。【参考方案2】:您正在执行的操作将起作用,并且浏览器将收到 404 代码。它不会做的是显示您可能期望的“未找到”页面,例如:
未找到
在此服务器上找不到请求的 URL /test.php。
这是因为当 PHP 返回 404 代码时,Web 服务器不会发送该页面(至少 Apache 不会)。 PHP 负责发送它自己的所有输出。所以如果你想要一个类似的页面,你必须自己发送 HTML,例如:
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>
您可以将 Apache 配置为对自己的 404 消息使用同一页面,方法是将其放入 httpd.conf:
ErrorDocument 404 /notFound.php
【讨论】:
谢谢。我以为它使用了我的 404 页面。 @JW 上面的代码将在哪里使用?是“.htaccess”文件的代码吗? @ManoharKumar 上面的代码用于您要发送 404 页面的位置。就我而言,当有人使用它的代码搜索一个项目时,我使用过它,但它不存在。所以我在发现该项目不可用后使用上面的代码,并且我在此代码的第 3 行也使用了 exit,以避免在 404 页面之后加载任何内容。谢谢你,JW,它对我很有效。【参考方案3】:试试这个:
<?php
header("HTTP/1.0 404 Not Found");
?>
【讨论】:
嗯,404 在 HTTP 1.0 和 1.1 中都是 404。 1.0 是一个安全的赌注。很酷的笑话顺便说一句:) +1 @TheEasyLearnAcademy 这真的没有意义......这与header("Location: any-url-that-does-not-exist");
基本相同 - 它会触发 302(临时)重定向到不存在的 URL,因此会生成 404重定向的(第二个)请求。您需要对当前请求生成 404 响应。【参考方案4】:
通过 .htaccess 文件创建自定义错误页面
1. 404 - 找不到页面
RewriteEngine On
ErrorDocument 404 /404.html
2。 500 - 内部服务器错误
RewriteEngine On
ErrorDocument 500 /500.html
3。 403 - 禁止
RewriteEngine On
ErrorDocument 403 /403.html
4. 400 - 错误请求
RewriteEngine On
ErrorDocument 400 /400.html
5. 401 - 需要授权
RewriteEngine On
ErrorDocument 401 /401.html
您还可以将所有错误重定向到单个页面。喜欢
RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html
【讨论】:
RewriteEngine 与此无关;可以安全地省略该行以获得相同的结果。【参考方案5】:你还记得在发送标头后 die() 吗? 404 标头不会自动停止处理,因此如果有进一步的处理发生,它可能看起来没有做任何事情。
重定向到您的 404 页面并不好,但您可以毫无问题地包含其中的内容。这样,您就有了一个从正确的 URL 正确发送 404 状态的页面,但它也有您的“您在寻找什么?”人类读者的页面。
【讨论】:
【参考方案6】:试一下
ErrorDocument 404 /(root directory)/(error file)
在.htaccess
文件中。
对任何错误执行此操作,但用 404 代替您的错误。
【讨论】:
【参考方案7】:在 Drupal 或 Wordpress CMS(以及可能的其他 CMS)中,如果您试图使某些自定义 php 代码看起来不存在(除非满足某些条件),则通过让 CMS 的 404 处理程序接管以下操作可以很好地工作:
<?php
if(condition)
do stuff;
else
include('index.php');
?>
【讨论】:
【参考方案8】:在该行之后立即尝试使用 exit
或 die()
关闭响应
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
exit;
或
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
【讨论】:
如果您这样做,用户会看到一个空白页面。我的问题是如何发送我用ErrorDocument
指定但来自 PHP 的相同 404 页面。
如果你想使用 ErrorDocument 确保你的自定义错误文件的路径是相对于服务器的根目录示例:假设你的虚拟路径是 /folder1/folder2/myhtaccess fromt he root of the服务器您的错误文档将类似于此 ErrorDocument 404 /folder1/folder2/my404.html
ErrorDocument
在您输入 PHP 代码后没有任何作用。 this answer 最能解释我 9 年前所面临的困惑
我希望你的问题现在已经解决了。关于题外话,我认为最好不要使用 ?name=word_here 进行重定向。相反,请在 page.php 文件中使用 $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");
。因为有一种情况,其中一个页面期望用户查询“名称”。【参考方案9】:
尝试一次。
$wp_query->set_404();
status_header(404);
get_template_part('404');
【讨论】:
这个答案与 WordPress 相关,但问题一般与 PHP 有关。以上是关于如何使用 PHP 创建错误 404 页面?的主要内容,如果未能解决你的问题,请参考以下文章
wordpress的后台如何设置404错误页面?我的主题里面有个404.html,不清楚怎么调用