为什么display_errors会更改HTTP状态代码?

And*_*cia 6 php http

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

php.ini中

display_errors = On
Run Code Online (Sandbox Code Playgroud)

的index.php

<?php test();
Run Code Online (Sandbox Code Playgroud)

得到:

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

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

<?php @test();
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

将php.ini更改为:

display_errors = Off
Run Code Online (Sandbox Code Playgroud)

原因:

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
Run Code Online (Sandbox Code Playgroud)

当display_errors为Off时,任何人都可以向我解释使web服务器以500响应的底层机制吗?

Chr*_*hey 7

原因在于,display_errors = On即使脚本中存在错误,您实际上也要求PHP为您提供合适的HTTP响应.可以把它想象成脚本和响应之间的附加层.它不再是你的脚本控制输出,它是PHP.

当您打开此选项时,您实际上是在说:" 如果有错误,请仍然给我一个有效的HTTP响应页面(它甚至可能包括正确的标记),因为我将查看而不是我的日志. "

设置为Off,HTTP响应应该没有意义,因此是500.使用它,预计会出现PHP错误,因此即使您的脚本失败,整个请求也不会是500.