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