【问题标题】:HTTP-404 header doesn't seem to work in server logHTTP-404 标头在服务器日志中似乎不起作用
【发布时间】:2011-09-13 05:32:15
【问题描述】:

我已经建立了一个动态网站并为静态 URL 修改了 .htaccess 文件,我需要为 SEO 创建一个 404 页面。

header("HTTP/1.0 404 Not Found");

当数据库中没有匹配的链接时,我正在使用上面的 PHP header() 函数,但是当我检查服务器日志时,这似乎不起作用并给出HTTP 200 OK 状态代码。

这是来自服务器日志的行:

[My IP] - - [12/Jun/2011:01:47:38 +0300] "GET /4k.html HTTP/1.1" 200 3284 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.91 Safari/534.30" 

4k.html是不存在的链接。

我错过了什么吗?

【问题讨论】:

  • 您如何为 404 PHP 脚本提供服务?即使您的 PHP 脚本返回 404,Apache 也可能认为您的方法很好并记录了 200。
  • 嗯,我正在检查页面顶部的数据库中是否存在链接,如果不存在,我在常规内容页面中使用 http 404 脚本并且我不更改任何元或头部除了标题之外的标签,这是正常情况吗?
  • Apache 无法检查数据库...此时您已经在执行 PHP 脚本。您如何/在哪里调用该 PHP 脚本?
  • @Onur 如果你在 Apache 下使用 FastCGI,你可以试试header("HTTP/1.0 404 Not Found", true); 甚至header("Status: 404 Not Found");
  • 您确定没有在标头之前向客户端输出任何数据?一旦任何输出被发送回客户端,标头将被忽略。

标签: php http-headers http-status-code-404


【解决方案1】:

据我了解,您正在将所有文件重写为单个 PHP 文件,以便 PHP 可以读取它并执行它为页面提供服务所需的操作。这意味着 Apache 对 404 页面的处理基本上将被覆盖。此时,由您的 PHP 文件提供页面或显示 404。据 Apache 所知,该请求导致 HTTP 代码为 200,因为它在触发 PHP 解析脚本并将输出提供给请求它的客户端。

在您的 PHP 脚本中,您将检查页面是否存在。如果页面存在,则显示该页面,否则,给出 404 消息。通过将header("HTTP/1.0 404 Not Found", true); 放入您的PHP 文件中您知道它是404 的位置,它会将404 标头发送到客户端,因此它已正确完成。要验证它是否被正确发送,触发 404(通过输入虚假 url)并在 Chrome 开发人员工具中查看请求详细信息,您应该在响应标头下看到您正在发送 404,而您的 Apache 日志显示 200 .

【讨论】:

  • 在开发者工具里好像也是200,写的是请求URL/4k.html,请求方法:GET,状态码:200 OK 我也在404页面调用了一些js和css文件,对结果有影响吗?
  • 不,不会影响结果。每个新资产(js、css 文档、图像等)都是它自己的单独请求。验证您正在查看面向 Web 的文档:i54.tinypic.com/mr4hnk.jpg 而不是说 200,它应该说 404。接下来,尝试将标头 sn-p 放在 PHP 文件的顶部,看看是否可以触发 404 .编辑:没有看到您最近的评论 - 尝试删除该 header() 函数的第二个参数。
  • 我把标题脚本放在页面的第一行,服务器仍然说“警告:无法修改标题信息 - 标题已发送(输出开始于..”我认为这是由服务器引起的
  • 我终于让它工作了。我禁用了 Unicode 签名 (BOM) 并且它工作了,但不知道那是为了什么.. :)
  • 啊,这样就行了。 BOM 称为字节顺序标记,文本编辑器会将其放置在文件中。在这种情况下是没有用的。标头是通过 HTTP 响应的前几行发送的,通过将 BOM 放在那里,可以防止 PHP 发送更多的标头。
猜你喜欢
  • 2013-03-30
  • 2021-12-09
  • 2011-09-19
  • 2020-03-06
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多