首页 > 解决方案 > 如何显示错误但仍获得正确的 HTTP 状态?

问题描述

我在开发过程中使用带有 NGINX 1.14.0 和 PHP 8.0.9 的 Laragon Lite。

如果我故意在我的 PHP 代码中出现语法错误(;例如,缺少 ),我会收到消息

解析错误:语法错误,意外变量“$username”在...

这是完全正常的。页面的 HTTP 状态虽然很奇怪,但它给了我一个200 OK状态!

display_errors = Off我可以通过在 php.ini 中设置来改变这种行为。然后我收到一个500 Internal Server Error状态,但不再显示该消息。

我怎样才能得到消息(需要调试)但仍然有正确的状态(由 AJAX 处理)?

标签: phpnginxhttp-status-codes

解决方案


我的理解是,如果您需要在发生错误时将标头响应更改为 error/500,请尝试使用以下代码:

set_error_handler("myErrorHandler");

echo $undefinedTest; //Throws a error for test

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    http_response_code(500);

    if (!(error_reporting() & $errno)) {
        // This error code is not included in error_reporting, so let it fall
        // through to the standard PHP error handler
        return false;
    }

    switch ($errno) {
    case E_USER_ERROR:
        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
        echo "  Fatal error on line $errline in file $errfile";
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
        echo "Aborting...<br />\n";
        exit(1);
        break;

    case E_USER_WARNING:
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
        break;

    case E_USER_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;

    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    /* Don't execute PHP internal error handler */
    return true;
}

推荐阅读