Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中发送404头后显示来自htaccess的404文档_Php_Html_.htaccess_Mod Rewrite_Redirect - Fatal编程技术网

在PHP中发送404头后显示来自htaccess的404文档

在PHP中发送404头后显示来自htaccess的404文档,php,html,.htaccess,mod-rewrite,redirect,Php,Html,.htaccess,Mod Rewrite,Redirect,在PHP中,我使用以下代码表示未找到页面: header("HTTP/1.0 404 Not Found");exit(); 在.htaccess文件中,我有以下行来处理404自定义文档: ErrorDocument 404 /404.html 现在,当我发送PHP404头文件时,我希望它会显示.htaccess中定义的自定义404.html,但它会显示一条消息“此链接似乎已断开”。因此,它不会显示自定义404页面,如果我从.htaccess中删除该行,它仍然不会显示服务器的常规404页面,

在PHP中,我使用以下代码表示未找到页面:

header("HTTP/1.0 404 Not Found");exit();
.htaccess
文件中,我有以下行来处理404自定义文档:

ErrorDocument 404 /404.html
现在,当我发送PHP404头文件时,我希望它会显示
.htaccess
中定义的自定义
404.html
,但它会显示一条消息“此链接似乎已断开”。因此,它不会显示自定义404页面,如果我从
.htaccess
中删除该行,它仍然不会显示服务器的常规404页面,并且还会显示断开的链接消息


那么,当我用PHP发送标题时,如何使其显示404页面呢?

您只需向浏览器发送404代码,然后尝试重定向到错误404页面

header('location: http://youdomain.com/404.html'); exit;

您只需向浏览器发送404代码,然后尝试重定向到错误404页面

header('location: http://youdomain.com/404.html'); exit;

这里的问题是,除非URL处理管道找不到URL指向的文件(或处理程序),否则不会处理由
ErrorDocument
表示的自定义错误文档。在您的情况下,处理管道确实找到了一个文件,即您的php文件,因此它本身永远不会到达404,因此永远不会应用
ErrorDocument

当apache使用php处理程序运行php文件,并且您的php文件决定返回404时,您不仅需要提供404响应代码,还需要提供HTML错误文档。您看不到默认的apache错误文档,因为apache从不认为请求是404(它将请求传递给您的php文件)。所以你需要这样做:

header("HTTP/1.0 404 Not Found");
include('404.html');
exit();

这里的问题是,除非URL处理管道找不到URL指向的文件(或处理程序),否则不会处理由
ErrorDocument
表示的自定义错误文档。在您的情况下,处理管道确实找到了一个文件,即您的php文件,因此它本身永远不会到达404,因此永远不会应用
ErrorDocument

当apache使用php处理程序运行php文件,并且您的php文件决定返回404时,您不仅需要提供404响应代码,还需要提供HTML错误文档。您看不到默认的apache错误文档,因为apache从不认为请求是404(它将请求传递给您的php文件)。所以你需要这样做:

header("HTTP/1.0 404 Not Found");
include('404.html');
exit();

如果我想在不重定向的情况下输出错误文档呢?例如,不向用户显示存在一个php脚本。那么,如果我可以重定向到404???@MichaelSamuel,404头有什么用呢?404头返回一个HTTP响应代码,告诉另一端的任何东西请求URL“未找到”。您可以重定向到错误文档,但从该文档返回的代码将是200,这将错误地使另一端的任何人认为错误的URL实际上是好的,而不管响应中的内容如何。如果我希望在不重定向的情况下输出错误文档,该怎么办?例如,不向用户显示存在一个php脚本。那么,如果我可以重定向到404???@MichaelSamuel,404头有什么用呢?404头返回一个HTTP响应代码,告诉另一端的任何东西请求URL“未找到”。您可以重定向到错误文档,但是从该文档返回的代码将是200,这将错误地使另一端的任何人认为错误的URL实际上是一个好的URL,而不管响应中的内容如何。看起来ErrorDocument指令不起作用。试试
RewriteEngine On
ErrorDocument 404/404.html
。我的RewriteEngine已经上线了…谢谢:)
RewriteEngine
(mod_rewrite)和
ErrorDocument
(core)是不相关的。FWIW,听起来您好像看到了浏览器的默认404错误文档,当您不发送空的响应正文时,您可能会看到(取决于浏览器)。看起来ErrorDocument指令不起作用。试试
RewriteEngine On
ErrorDocument 404/404.html
。我的RewriteEngine已经上线了…谢谢:)
RewriteEngine
(mod_rewrite)和
ErrorDocument
(core)是不相关的。FWIW,听起来您好像看到了浏览器的默认404错误文档,当您不发送空的响应正文时,您可能会看到(取决于浏览器)。就是这样!多年不知道该怎么做很高兴我在这里问了…非常感谢乔恩:是什么做的!好几年都不知道该怎么做很高兴我在这里问了…非常感谢Jon:D