【问题标题】:Force 404 with PHP and .htaccess not working使用 PHP 和 .htaccess 强制 404 不起作用
【发布时间】:2011-11-02 02:39:02
【问题描述】:

我正在尝试在 PHP 中抛出我自己的 404,具体取决于某些 GET 变量。但以下不起作用。我可以确认 pge 标头返回“404 状态代码”。 .htaccess 似乎没有正确重定向。 我错过了什么吗?

PHP 代码:

if(!$_GET['page']){
    header('HTTP/1.0 404 Not Found');
}

.htaccess 代码:

ErrorDocument 404 /404.html

非常感谢!

【问题讨论】:

  • 我猜 Apache 不会抛出 404 错误,因为该页面确实存在。也许你应该在 php 中添加一个重定向到 404 页面?
  • 不要重定向到 404 错误页面,这会将其变成 200 请求。只需让 PHP 包含错误页面的内容即可。
  • @Marc 但是他已经用 404 状态码响应了,他不应该删除那部分。
  • @Andre 是的,但是要进行重定向,它必须是 301 错误代码。你不能输出 404 not found + 301 去别处。 Apache 不会进行重定向来提供 404 页面。这只是一个内部重写,它会转储指定 404 页面的内容,而无需进行重定向。
  • 如果页面存在并且对网络可见,那么 404 是不合适的。由于您正在检查值并在值不合适时引发错误,因此 412 Precondition Failed 错误可能会更好。

标签: php .htaccess redirect http-status-code-404


【解决方案1】:

就 Apache 而言,它已经完成了它的工作,因为它正确地找到了用户请求所要求的页面/脚本。脚本输出 404 标头这一事实与 Apache 无关,因为它的工作已正确完成。

您需要让您的 PHP 脚本输出 404 标头,并包含 Apache 404 处理程序指向的页面:

if (!$_GET['page']) {
    header('HTTP/1.0 404 Not Found');
    include('404.html');
    exit();
}

不要重定向到 404 页面,因为这只会将点击变成正常的 GET 请求,结果为 200 OK。

【讨论】:

  • @Mark:您的标题语法中有一个小错字。为你修好了。另外,我不确定这是否重要,但是当我在 PHP 中输​​出带有状态码的标头时,我想确保它被覆盖,如下所示:header('HTTP/1.0 404 Not Found', true, 404);
  • 提供标头有什么意义('HTTP/1.0 404 Not Found');如果我只是要手动包含 404.html 页面?
  • include('404.html'); 我会改用readfile('404.html');,因为404.html 并不表示它应该执行任何PHP 代码。
  • @pagewil:因为状态码是客户端(即浏览器、网络爬虫等)的信息。404.html的内容是用户的信息.
  • @pagewil 会告诉浏览器和爬虫该页面不存在(404页面是给用户的,404状态是给程序的)。
【解决方案2】:

在我知道的 XAMPP 测试服务器上,您不能让错误页面以数字开头...

这可能适用于 windows ... 时期

那个人躲了我几个小时

尝试将您的错误页面重命名为:

error404.html

然后将 404 的 .htaccess 错误部分更改为:

错误文档 404 /error404.html

并且不要忘记以正斜杠开头。这样就解决了。

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 2019-09-08
    • 2014-05-23
    • 1970-01-01
    • 2015-04-09
    • 2012-07-30
    • 2012-08-04
    • 2011-06-16
    • 2013-01-30
    相关资源
    最近更新 更多