2

试图将页面重定向到我的自定义 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页面继续,没有实现重定向!

4

4 回答 4

2

您应该header("Location: /errors/junk.php");按照 Apache 对自定义错误文档的处理方式进行操作,只是在服务器级别而不是在 PHP 中。我相信 Apache 使用 301 重定向,但我可能是错的。

于 2013-01-09T18:27:18.950 回答
2

您明显的文件结构:

/
  .htaccess
  request.php
  ...
  errors/
    junk.php

.htaccess

ErrorDocument 404 /errors/junk.php

请求.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;

错误/垃圾.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 而言,这个 ~file~ 实际上存在。

http://yoursite.com/filethatdoesntexist.php将显示:

您要查找的文件~不存在~。

[可能有助于编写自定义 404 处理程序代码的 $_SERVER 转储]

如果您有一个存在的文件,但您希望它假装它是 404,您可以在 PHP 中将重定向编写为:

header('Location: http://mysite.com/errors/junk.php');
exit;

这会将浏览器重定向到完整的 URL,或者简单地:

include('errors/junk.php');
exit;

这将使用户留在同一页面 URL,但会显示您的错误代码。

于 2013-01-09T18:40:22.787 回答
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;

此操作对最终用户将保持不可见。

于 2013-01-09T18:44:33.873 回答
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;
于 2013-11-27T19:42:46.957 回答