3

我目前正在迁移到 nginx 服务器。我试着把它放在我的 404 ErrorDocument 中,名为404.php

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

如果我现在尝试访问http://mydomain.com/404.php,这将按预期工作:它将我重定向到 Google。但是,一旦我尝试访问http://mydomain.com/iDoNotExist,就会显示 404 ErrorDocument,而不会将我重定向到 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,唷)。

4

1 回答 1

4

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

因此,响应的超文本正文会显示在浏览器中 - 正如 HTTP 规范中代码 404 所指定的那样(请参阅10.4.5 404 Not Found)。


为了允许将 HTTP 响应代码从 404 更改为不同的(例如 302 用于临时重定向),您必须相应地配置Nginxerror_page指令:

error_page   404 = /404.php;

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

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

SAPI:php5-fpm

于 2014-01-05T11:36:12.283 回答