header('HTTP / 1.1 404 Not Found');什么也没做

时间:2013-01-09 18:16:28

标签: php redirect header http-status-code-404

尝试将页面重定向到我的自定义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 个答案:

答案 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;