尝试将页面重定向到我的自定义404错误文档,但是徒劳无功。 继承人的代码
header('HTTP/1.1 404 Not Found', true, 404);
但即使标题信息按要求更改,它也会保留在同一页面上
HTTP/1.1 404 Not Found
Date: Wed, 09 Jan 2013 18:10:44 GMT
Server: Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.8
PHP页面继续,没有重定向!
答案 0 :(得分:2)
你应该只做header("Location: /errors/junk.php");
,因为它基本上是Apache用自定义错误文档做的,只是在服务器级而不是在PHP中。我相信Apache使用301重定向,但我可能是错的。
答案 1 :(得分:2)
您的明显文件结构:
/
.htaccess
request.php
...
errors/
junk.php
的.htaccess
ErrorDocument 404 /errors/junk.php
request.php
header('HTTP/1.1 404 Not Found', true, 404);
echo "Despite the 404 header this ~file~ actually exists as far as Apache is concerned.";
exit;
错误/ junk.php
header('HTTP/1.1 404 Not Found', true, 404);
echo "The file you're looking for ~does not~ exist.";
echo "<pre>" . var_export($_SERVER, TRUE) . "</pre>";
exit;
http://yoursite.com/request.php会显示:
尽管有404标题,但就Apache而言,这个文件实际存在。
http://yoursite.com/filethatdoesntexist.php会显示:
您正在寻找的文件〜不存在。
[$ _SERVER转储,可能有助于编写自定义404处理程序代码]
如果您有一个存在的文件,但是您希望它假装它是404,您可以在PHP中编写重定向:
header('Location: http://mysite.com/errors/junk.php');
exit;
将浏览器重定向到完整的网址,或者只是:
include('errors/junk.php');
exit;
这将使用户处于同一页面网址,但会显示您的错误代码。
答案 2 :(得分:1)
不要对错误页面使用3xx
重定向。他们所做的只是让搜索引擎感到困惑,认为页面存在于不同的位置。您可以尝试这种方法:
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
require_once("errors/404.php");
die;
修改错误页面,以便可以直接执行(例如,当Apache处理404错误本身时)或包含(在脚本中)。
如果include_once
不是选项,您可以执行以下操作:
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
echo file_get_contents("http://yoursite.com/errors/404.php");
die;
此操作对最终用户仍然不可见。
答案 3 :(得分:1)
如果您使用的是FastCGI,则无法通过
发送404响应标头header('HTTP/1.1 404 Not Found', true, 404);
相反,你必须使用
header('Status: 404 Not Found');
此外,header('Status:...')
指令无法与header('Location:...')
结合使用。
因此,在FastCGI的情况下,以下代码将提供正确的404响应代码并重定向到自定义404页面:
header('Status: 404 Not Found');
echo file_get_contents('http://www.yoursite.com/errors/custom404.html');
exit;