http_response_code() 总是 returns 200,即使是 404

http_response_code() always returns 200, even on 404

我正在尝试使用 Apache 的 ErrorDocument 来处理客户端和服务器错误,方法是将它们传递给 error.php

.htaccess

ErrorDocument 400 /error.php
...
ErrorDocument 404 /error.php
...
ErrorDocument 511 /error.php

error.php

var_dump(http_response_code());

因此,我将浏览器指向不存在的 mywebsite.com/noeutdhoaeu。正如您所期望的,来自服务器的响应是 404 Not Found。但是 PHP 给了我 200.

什么给了?

编辑:我在基于 Apache 的本地主机上有完全相同的代码,它工作得很好。这就是我问这个问题的原因。 PHP 完全意识到在我的本地环境中发生了 404 错误。然而,在我的托管环境中,PHP 不知道。

这个函数基本上是setter/getter对于PHP的响应码。如果没有参数,此函数 return 是 PHP 当前设置的响应代码 。由于默认响应代码是 200,如果不通过首先传递参数来设置不同的代码,200 将始终是 return。

请参阅 manual 中的示例:

var_dump(http_response_code()); // int(200) - default
http_response_code(404); // set a new code
var_dump(http_response_code()); // int(404) - new code

还值得注意的是,header()调用也可能会影响此函数的return值,例如:

header('http/1.0 404 not found');
var_dump(http_response_code()); // int(404) - new code

正如@Boaz 所说,PHP 不知道 Apache 稍后要设置什么。

您可以使用此方法来使用 PHP 中的错误代码:

ErrorDocument 400 /error.php?error=400
ErrorDocument 401 /error.php?error=401
...

并在 PHP 测试 $_GET["error"].