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

问题描述

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

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

但下面的似乎也工作正常

header('HTTP/1.1 404');

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

$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 中,存储了代码/消息列表。

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,"Status: %d %s",SG(sapi_headers).http_response_code,err->msg);
            } else {
                len = slprintf(buf,"Status: %d",SG(sapi_headers).http_response_code);
            }
        //...

然后函数 LSAPI_SetRespStatus_r() 保存这些信息,最后,函数 LSAPI_FinalizeRespHeaders_r() 发送最终的头信息。

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

len = slprintf(buf,err->msg);

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...