使用 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');
想知道是否绝对有必要指定状态代码描述,如 OK
、Not 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;
我经常看到响应代码是这样设置的:
header('HTTP/1.1 404 Not Found');
但下面的似乎也能正常工作
header('HTTP/1.1 404');
想知道是否绝对有必要指定状态代码描述,如 OK
、Not 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;