在htaccess上使用header()找不到404

时间:2011-09-10 20:14:34

标签: php mysql .htaccess http-status-code-404 http-status-code-200

有些网页实际上包含在我的数据库中。 我有以下

的htaccess
ErrorDocument 404 /error404.php

我的错误404执行了require("checkdb.php"); 检查文件名是否在MySQL db中表示。如果是这样,我想返回200 OK并吐出内容。 如果没有,我想吐出那个404

我的问题是我遇到了404.虽然我的页面显示得很好,但搜索引擎无法获取它,而且谷歌+不起作用,如果它检查页面,它会得到404。

我添加了

header('HTTP/1.1 200 OK'); 

在检查数据库后(没有显示html代码),但我得到了

  

警告。无法修改标题信息 - 已经由....发送的标题

即使我在header()的开头移动了/error404.php,我仍然会遇到错误。听起来Apache会首先返回404,然后调用/error404.php

我该怎么做才能正确解决这个问题? 非常感谢提前!

2 个答案:

答案 0 :(得分:1)

当Apache发送ErrorDocument指定的文档时,它不会将其作为常规页面提供,并且已经发送了404标头。除了在Apache中使用ErrorDocument指令之外,您应该使用PHP脚本首先检查文档是否存在,如果存在,则显示它。如果它不存在,那么PHP会自己发送404错误标题。

以下内容不会发生在error404.php中,而是发生在像index.php这样的普通脚本中:

// Do whatever you're doing to check
require("checkdb.php");

// If the check fails, PHP sends the 404:
header("HTTP/1.0 404 Not Found");
// Then display your custom error document with PHP
// You can display the other contents of error404.php
echo "Oops, page wasn't found!";
exit();

从Apache配置中删除ErrorDocument指令。

答案 1 :(得分:0)

标题行必须在任何输出之前。如果没有一些代码,我们就无法指出输出的来源。