何时发送HTTP状态码?

4

目前在我的PHP脚本中,当用户尝试访问不存在或不属于该用户的内容时,我会将其重定向到自定义的404未找到错误页面。如下:

header('Location: http://www.mydomain.com/error/notfound/');
exit;

我知道上面的header()调用默认会发送302重定向状态码。
然而,我不明白的是什么时候应该发送404未找到状态码。是在重定向用户之前还是在显示“/error/notfound/”页面时?
感谢您的帮助!
6个回答

12

你应该像这样做:

header("HTTP/1.0 404 Not Found");
include 'error.php';
die();

2
如果浏览器使用HTTP/1.1连接会发生什么?PHP是否强制Apache使用mod_php发送HTTP/1.1响应? - Christian

9
你不应该将404错误作为重定向来执行。
实际上,你需要发送404状态头,并用404页面的内容替换当前输出。
有多种方法可以实现这一点,这取决于你的网站结构。MVC应用程序通常使用forward方式处理此问题。我见过其他系统抛出异常,然后注册的异常处理程序负责显示404页面。
无论如何,大致步骤如下:
1.确定内容无效
2.跳出当前执行
3.清除任何输出(如果有的话)
4.发送404状态头
5.发送404页面的内容

+1 讲解得非常好。特别是提到 404 错误不会执行重定向,我认为这一点非常重要。 - David Z

1

来自php.net:

有两种特殊情况的头部调用。第一种是以字符串“HTTP/”(大小写不敏感)开头的头部,将用于确定要发送的HTTP状态代码。例如,如果您已经配置了Apache使用PHP脚本来处理缺失文件的请求(使用ErrorDocument指令),您可能希望确保您的脚本生成正确的状态代码。

<?php
header("HTTP/1.0 404 Not Found");
?>

http://us.php.net/manual/en/function.header.php


1

你不能同时使用404和Location:。Location仅适用于某些响应(201和3xx)

但是,你可以将自定义HTML页面作为404响应的正文发送。


0

你应该发送一个404 HTTP状态码。浏览器和网络爬虫都能理解这个状态码。你可能还想包含一个更友好的错误页面,解释发生了什么,包括一个搜索你的网站的表单、Soundex链接等。


0

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