php 为什么display_errors会改变HTTP状态码?

rvpgvaaj  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(73)

正如在许多其他问题中指出的那样,在php.ini中将display_errors设置为Off会使Web服务器在遇到致命错误时的状态代码为500 Internal server error而不是200 OK。我用一个未定义的函数设置了一个简单的测试来解释这个行为:
php.ini

display_errors = On

index.php

<?php test();

提供:

Fatal error: Call to undefined function test()
in D:\xampp\htdocs\index.php on line 1

或者只是一个空白页,如果我像这样静默函数调用:

<?php @test();

在这两种情况下,答案标题如下:

HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 20:08:22 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
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

将php.ini更改为:

display_errors = Off

原因:

HTTP/1.0 500 Internal Server Error
Date: Tue, 10 Jul 2012 20:10:35 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
Content-Length: 0
Connection: close
Content-Type: text/html

有谁能解释一下当display_errors为Off时,Web服务器的响应为500的底层机制吗?

mjqavswn

mjqavswn1#

原因是,使用display_errors = On,您实际上是要求PHP即使在脚本中存在错误时也能给予一个像样的HTTP响应。可以把它想象成脚本和响应之间的附加层。它不再是你的脚本控制输出,它是PHP。
当你打开这个选项时,你实际上是在说,“* 如果有错误,请仍然给予我一个有效的HTTP响应页面(它甚至可能包括体面的标记),因为我将查看而不是我的日志。
如果将其设置为Off,则HTTP响应应该是无意义的,因此是500。打开它时,PHP会出现错误,所以即使脚本失败,请求
总体上**也不是500。

oalqel3c

oalqel3c2#

我认为这是一个历史遗留问题。在较旧的IE浏览器上,当状态代码为500时,HTML正文将被忽略。由于无法查看正文中显示的错误,调试很困难。将状态代码更改为200是为了兼容这些旧浏览器。
这个应该有帮助bugs

if(1 == ini_get('display_errors')) {
  register_shutdown_function(function() {
    if ((error_get_last()['type']??0) == E_ERROR) {
        headers_sent() || http_response_code(500);
    }
  });
}

相关问题