【发布时间】:2013-03-04 10:26:59
【问题描述】:
我已经在 Ubuntu 上用 php-fpm 配置了 nginx(一切运行良好)。
我遇到的一件事是,当发生 PHP 解析错误时,发送了 HTTP 状态代码 200。错误日志包含以下条目:
[error] 3205#0: *2854 FastCGI sent in stderr: “PHP Parse error: syntax error, unexpected T_REQUIRE_ONCE in /var/www/.../index.php on line 32”同时从上游读取响应头,客户端:1.2.3.4,服务器:example.com;请求:“GET / HTTP/1.1”,上游:“fastcgi://127.0.0.1:9000”,主机:“example.com”
我无法弄清楚,为什么不发送代码 50x。我没有配置了任何error_page设置,我阅读了documentation of error_page。我也尝试过设置状态码(error_page 500 =500 /50x.html 等等)。但总是返回状态 200。
我可以从 PHP (header('HTTP/1.1 404 Not Found')) 发送状态标头,这是可行的。但是,对于 PHP 解释器发出的错误(也包括未捕获的异常),服务器的响应没有考虑到发生了错误。
【问题讨论】:
-
这是它在每个网络服务器上的响应方式,您确定要这样做吗?我的意思是无论如何它实际上没有任何用处,您的脚本不应该失败,并且在开发状态期间,如果您可以阅读错误,则 200 很好..,如果状态代码不是 200 较新的浏览器经常使用他们自己的错误页面,因此您无法读取错误,这会使调试更加困难
-
不幸的是,你是对的。我刚刚注意到 mod_php 也会发送关于 PHP 错误的状态 200(解析错误,未捕获的异常)。这真的很谦虚.. 不关心如何调试错误(因为 display_errors 应该在生产中关闭),但我真的很惊讶 PHP 以错误的方式执行此操作并输出带有“OK”状态代码的错误。难怪 google 到处都是 PHP 错误信息。
-
好吧.. 幸好不是 PHP 引起的,而是 xdebug 引起的:bugs.php.net/bug.php?id=50921