如何使用 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】:

在该行之后立即尝试使用 exitdie() 关闭响应

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 页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何将404页面与php页面加载脚本连接起来

PHP中的自定义404错误页面

如何设置404页面,404错误页面自定义方法

wordpress的后台如何设置404错误页面?我的主题里面有个404.html,不清楚怎么调用

如何使用 Codeigniter 在自定义 404 页面中重定向 404 错误?

如何使用页面应用程序中的自定义页面更改默认的 404 错误页面