如何在PHP中创建错误404?


111

我的.htaccess将所有请求重定向/word_here/page.php?name=word_here。然后,PHP脚本检查请求的页面是否在其页面数组中。

如果没有,如何模拟错误404?我试过了,但是并没有导致我的404页面ErrorDocument.htaccess出现时通过配置。

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

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


为什么您说它不起作用?您检查服务器响应标头了吗?
Gumbo

1
回答您的最后一个问题,是的,将所有404重定向到真实页面是一个坏主意。通过将不应该存在的内容转换为存在的内容,这违反了HTTP规范。
卢卡斯·阿曼

Answers:


156

用于生成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

87

您正在执行的操作将起作用,并且浏览器将收到404代码。它不会执行的是显示您可能期望的“未找到”页面,例如:

未找到

在此服务器上找不到请求的URL /test.php。

这是因为,当PHP返回404代码时(至少Apache不会),Web服务器不会发送该页面。PHP负责发送自己的所有输出。因此,如果您想要类似的页面,则必须自己发送HTML,例如:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

您可以将Apache放置在httpd.conf中,以将同一页面用于其自己的404消息:

ErrorDocument 404 /notFound.php

谢谢。我以为它使用了我的404页面。
Eric

@JW上面的代码将在哪里使用?是“ .htaccess”文件的代码。
Manohar Kumar 2015年

@ManoharKumar上面的代码在您要发送404页面的位置使用。就我而言,我曾经用某个人搜索带有其代码的项目,但该项目不存在。因此,在发现该项目不可用之后,我使用了上面的代码,并且我在代码的第三行也使用了退出,以避免在404页之后加载任何内容。谢谢JW,它对我来说非常有效。
哈莎


9

通过.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与此无关。该行可以安全地省略以达到相同的结果。
WoodrowShigeru

3

您还记得发送标头后死掉了吗?404标头不会自动停止处理,因此,如果正在进行进一步的处理,它似乎没有做任何事情。

重新定向到404页面不好,但是可以毫无问题地包含其中的内容。这样,您的页面可以从正确的URL正确发送404状态,但同时也包含“您要查找的内容”?供读者阅读的页面。


0

尝试把

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

.htaccess文件中。

对任何错误执行此操作,但将404替换为您的错误。


0

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

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>

-2

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

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

要么

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

1
如果执行此操作,用户将看到一个空白页。我的问题是如何ErrorDocument从PHP 发送与我指定的相同的404页面。
埃里克

如果要使用ErrorDocument,请确保自定义错误文件的路径是相对于服务器示例的根目录:假设您的虚拟路径是/ folder1 / folder2 / myhtaccess,从服务器的根目录开始,您的错误文档将看起来像这样ErrorDocument 404 /folder1/folder2/my404.html
user5891645

ErrorDocument输入PHP代码后,它没有任何作用。这个答案最能说明我9年前
Eric

希望您的问题现在得到解决。关于主题,我认为最好不要使用?name = word_here进行重定向。而是 $reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");在page.php文件中使用。因为存在一种情况,这些页面之一期望用户查询“名称”。
user5891645

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.