PHP: How to send HTTP response code?

后端 未结 9 1845
无人共我
无人共我 2020-11-22 06:05

I have a PHP script that needs to make responses with HTTP response codes (status-codes), like HTTP 200 OK, or some 4XX or 5XX code.

How can I do this in PHP?

9条回答
  •  终归单人心
    2020-11-22 06:12

    I just found this question and thought it needs a more comprehensive answer:

    As of PHP 5.4 there are three methods to accomplish this:

    Assembling the response code on your own (PHP >= 4.0)

    The header() function has a special use-case that detects a HTTP response line and lets you replace that with a custom one

    header("HTTP/1.1 200 OK");
    

    However, this requires special treatment for (Fast)CGI PHP:

    $sapi_type = php_sapi_name();
    if (substr($sapi_type, 0, 3) == 'cgi')
        header("Status: 404 Not Found");
    else
        header("HTTP/1.1 404 Not Found");
    

    Note: According to the HTTP RFC, the reason phrase can be any custom string (that conforms to the standard), but for the sake of client compatibility I do not recommend putting a random string there.

    Note: php_sapi_name() requires PHP 4.0.1

    3rd argument to header function (PHP >= 4.3)

    There are obviously a few problems when using that first variant. The biggest of which I think is that it is partly parsed by PHP or the web server and poorly documented.

    Since 4.3, the header function has a 3rd argument that lets you set the response code somewhat comfortably, but using it requires the first argument to be a non-empty string. Here are two options:

    header(':', true, 404);
    header('X-PHP-Response-Code: 404', true, 404);
    

    I recommend the 2nd one. The first does work on all browsers I have tested, but some minor browsers or web crawlers may have a problem with a header line that only contains a colon. The header field name in the 2nd. variant is of course not standardized in any way and could be modified, I just chose a hopefully descriptive name.

    http_response_code function (PHP >= 5.4)

    The http_response_code() function was introduced in PHP 5.4, and it made things a lot easier.

    http_response_code(404);
    

    That's all.

    Compatibility

    Here is a function that I have cooked up when I needed compatibility below 5.4 but wanted the functionality of the "new" http_response_code function. I believe PHP 4.3 is more than enough backwards compatibility, but you never know...

    // For 4.3.0 <= PHP <= 5.4.0
    if (!function_exists('http_response_code'))
    {
        function http_response_code($newcode = NULL)
        {
            static $code = 200;
            if($newcode !== NULL)
            {
                header('X-PHP-Response-Code: '.$newcode, true, $newcode);
                if(!headers_sent())
                    $code = $newcode;
            }       
            return $code;
        }
    }
    

提交回复
热议问题