重定向而不是404错误页面 - 状态代码不起作用(Nginx)

时间:2014-01-05 10:59:19

标签: php redirect nginx errordocument

我目前正在转向nginx服务器。我尝试将它放在我的名为404.php的<...}}的错误文档中:

<?php
    header("Location: http://www.google.com/");
?>

如果我现在尝试访问http://mydomain.com/404.php,这可以正常运行:它会将我重定向到Google。但是,一旦我尝试访问http://mydomain.com/iDoNotExist,404错误文档就会显示为而不会将我重定向到Google。

这种行为对我来说似乎很奇怪。有什么方法可以解决这个问题吗?

修改

这是卷曲页面给我的东西:

curl -I mydomain.com/404.php

HTTP/1.1 302 Moved Temporarily
Server: nginx/1.2.1
Date: Sun, 05 Jan 2014 11:31:15 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.4-14+deb7u7
Location: http://google.com/

curl -I mydomain.com/iDoNotExist

HTTP/1.1 404 Not Found
Server: nginx/1.2.1
Date: Sun, 05 Jan 2014 11:33:49 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.4.4-14+deb7u7
Location: http://google.com/

编辑2:

正如hakre所说,我来自 Apache 设置,是的,我正在使用 Chromium 。至于Apache,这曾经适用于所有Gecko和Webkit浏览器,甚至是基于控制台的浏览器,例如Lynx。它可能也适用于Internet Explorer,但我从未尝试过(这里没有Windows,phew)。

1 个答案:

答案 0 :(得分:4)

浏览器的行为是正确的。 Location:响应标头对状态代码404没有意义(比较14.30 Location10.4 Client Error 4xx)。

因此,响应的超文本正文显示在浏览器中 - 由代码404的HTTP规范指定(参见10.4.5 404 Not Found)。


要允许将HTTP响应代码从404更改为另一个(例如302用于临时重定向),您必须相应地配置Nginx error_page指令:

error_page   404 = /404.php;

如果没有等号(=),则无法使用PHP脚本更改状态代码:

header("Location: http://google.com"); # PHP sets 302 status code

SAPI:php5-fpm