136

我的文件.htaccess处理来自/word_here我的内部端点的所有请求/page.php?name=word_here。PHP 脚本然后检查请求的页面是否在其页面数组中。

如果没有,我该如何模拟错误 404?

我试过这个,但它并没有导致我的 404 页面配置 viaErrorDocument出现.htaccess

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

我是否认为重定向到我的错误 404 页面是错误的?

4

9 回答 9

214

生成 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()不是绝对必要的,但它确保您不会继续正常执行。

于 2017-01-11T14:28:26.053 回答
92

您正在做的事情将起作用,并且浏览器将收到 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
于 2009-09-04T19:50:01.510 回答
27

试试这个:

<?php
header("HTTP/1.0 404 Not Found");
?>
于 2009-09-04T19:36:11.647 回答
15

通过 .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
于 2016-03-30T10:34:41.273 回答
5

发送标头后你还记得 die() 吗?404 标头不会自动停止处理,因此如果发生进一步的处理,它可能看起来没有做任何事情。

重定向到您的 404 页面并不好,但您可以毫无问题地包含其中的内容。这样,您就有了一个从正确的 URL 正确发送 404 状态的页面,但它也有您的“您在寻找什么?” 人类读者的页面。

于 2009-09-04T19:50:55.313 回答
0

试着把

ErrorDocument 404 /(root directory)/(error file) 

.htaccess文件中。

对任何错误执行此操作,但用 404 代替您的错误。

于 2018-05-20T19:41:37.770 回答
-1

在 Drupal 或 Wordpress CMS(以及可能的其他 CMS)中,如果您试图使某些自定义 php 代码看起来不存在(除非满足某些条件),则通过使 CMS 的 404 处理程序接管以下内容可以很好地工作:

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>
于 2019-01-28T19:38:13.317 回答
-3

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

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
exit;

或者

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();
于 2018-05-25T04:22:01.333 回答
-4

试试这个。

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
于 2020-03-31T04:24:10.667 回答