使用 header('HTTP/1.1 <status-code>') 在 PHP 中设置 HTTP 响应状态代码?

Setting HTTP response status code in PHP using header('HTTP/1.1 <status-code>')?

我经常看到响应代码是这样设置的:

header('HTTP/1.1 404 Not Found');

但下面的似乎也能正常工作

header('HTTP/1.1 404');

想知道是否绝对有必要指定状态代码描述,如 OKNot Found 等。我想避免指定,因为我的状态代码是一个变量,我需要维护某种 table 将每个状态代码映射到状态代码描述。请在下面找到我正在使用的代码。

$status = 404; //or any other response code
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header($protocol." $status");

感谢任何帮助。

消息已发送,即使您没有提供。

PHP source code中,我们可以看到它是如何工作的。

sapi/litespeed/lsapi_main.c中,存储了code/message个列表。

static const http_error http_error_codes[] = {
   {100, "Continue"},
   {101, "Switching Protocols"},
   {200, "OK"},
   // ...
   {403, "Forbidden"},
   {404, "Not Found"},
   // ...
   {0,   NULL}
};

然后,在sapi_lsapi_send_headers_like_cgi()中,从sapi_lsapi_send_headers()开始,状态被转换为整数,在http_error结构中找到消息(下面省略了很多行):

if (SG(sapi_headers).http_response_code != 200)
{
    // ...
    if (SG(sapi_headers).http_status_line &&
         (s = strchr(SG(sapi_headers).http_status_line, ' ')) != 0 &&
         (s - SG(sapi_headers).http_status_line) >= 5 &&
         strncasecmp(SG(sapi_headers).http_status_line, "HTTP/", 5) == 0
    ) {
        len = slprintf(buf, sizeof(buf), "Status:%s", s);
        response_status = atoi((s + 1));
    }
    // ...
            http_error *err = (http_error*)http_error_codes;
            while (err->code != 0) {
                if (err->code == SG(sapi_headers).http_response_code) {
                    break;
                }
                err++;
            }
            if (err->msg) {
                len = slprintf(buf, sizeof(buf), "Status: %d %s", SG(sapi_headers).http_response_code, err->msg);
            } else {
                len = slprintf(buf, sizeof(buf), "Status: %d", SG(sapi_headers).http_response_code);
            }
        //...

然后函数 LSAPI_SetRespStatus_r() 保存此信息,最后,函数 LSAPI_FinalizeRespHeaders_r() 发送最终的 header 信息。

interesting line是(存储来自http_error的消息):

len = slprintf(buf, sizeof(buf), "Status: %d %s", SG(sapi_headers).http_response_code, err->msg);

有关信息,另请参阅 http_error 的简单结构:

typedef struct _http_error {
  int code;
  const char* msg;
} http_error;