问题 用PHP和.htaccess强制404不工作


我试图在PHP中抛出自己的404 取决于某些GET变量。但以下是行不通的。我可以确认pge标题回来时带有'404状态代码'。 .htaccess似乎没有正确重定向。 我错过了什么吗?

PHP代码: 

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

.htaccess代码:

ErrorDocument 404 /404.html

非常感谢!


3859
2017-08-23 16:12


起源

我猜Apache不会因为页面实际存在而抛出404错误。也许你应该在php中添加重定向到404页面? - Andre Backlund
不要重定向到404错误页面,这会将其变为200请求。让PHP包含错误页面的内容。 - Marc B
@Marc但他已经回复了404状态代码,他不应该删除那部分。 - Andre Backlund
@Andre是的,但要进行重定向,它必须是301错误代码。您无法输出404未找到+ 301去其他地方。 Apache没有重定向来提供404页面。它只是一个内部重写,它会转储指定404页面的内容,而不会进行重定向。 - Marc B
如果页面存在且对Web可见,则404不合适。由于您正在检查值并在值不合适时抛出错误,因此412 Precondition Failed错误可能会更好。 - dnagirl


答案:


就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。


12
2017-08-23 16:18



@Mark:你的标题语法中有一个小错字。为你修好了。另外,我不确定它是否重要,但是当我输出带有PHP状态代码的标题时,我想确保它被覆盖,如下所示: header('HTTP/1.0 404 Not Found', true, 404); - nikc.org
提供标题有什么意义('HTTP / 1.0 404 Not Found');如果我要手动包含404.html页面? - wilsonpage
include('404.html'); 我会做 readfile('404.html'); 相反,作为 404.html 并不表示它应该执行任何PHP代码。 - arnaud576875
@pagewil:因为状态代码是的信息 客户端 (即浏览器,webcrawler等)404.html的内容是的信息 用户。 - nikc.org
@pagewil它会告诉浏览器和抓取工具页面不存在(404页面是针对用户的,404状态是针对程序的)。 - arnaud576875


您不能在我知道的XAMPP测试服务器上使用数字开始错误页面... 

对于windows ...期间可能是这样


0
2017-07-06 05:39