http状态行
响应头
Server //响应server名
Date //响应头日期
Content-Length //内容长度
Content-Encoding //内容编码格式
Location //响应的location头
Last-Modified //响应的last-modified头
Accept-Ranges //响应的range大小单位类型
Expires //响应的expires过期头
Cache-Control //Cache-Control响应头
Etag //响应的Etag头
nginx发送http响应头数据的处理流程
1.配置响应头处理filter函数
static ngx_int_t
ngx_http_header_filter_init(ngx_conf_t *cf)
{
/*设置top_header_filter函数指针 形成链式的top_header_filter处理结构*/
ngx_http_top_header_filter = ngx_http_header_filter;
return NGX_OK;
}
2.http响应头数据发送的实际流程
static ngx_int_t
ngx_http_header_filter(ngx_http_request_t *r)
{
...
if (r->header_sent) {
/*header_sent为真 说明头部数据已经发送过了 直接返回即可*/
return NGX_OK;
}
/*标记头部数据已经发送*/
r->header_sent = 1;
if (r != r->main) {
/*当前处理的不是主请求 返回 (只有主请求才能发送响应头数据)*/
return NGX_OK;
}
if (r->http_version < NGX_HTTP_VERSION_10) {
/*只处理在1.0及以上版本的http类型*/
return NGX_OK;
}
if (r->method == NGX_HTTP_HEAD) {
/*如果请求的方法是head 则只需要发送头部数据即可*/
r->header_only = 1;
}
if (r->headers_out.last_modified_time != -1) {
/*响应头有last-modified-time信息*/
if (r->headers_out.status != NGX_HTTP_OK
&& r->headers_out.status != NGX_HTTP_PARTIAL_CONTENT
&& r->headers_out.status != NGX_HTTP_NOT_MODIFIED)
{
/*响应头不是正常的200/206/304响应码 直接设置last-modified-time为无效*/
r->headers_out.last_modified_time = -1;
r->headers_out.last_modified = NULL;
}
}
/*取得响应数据的初始长度*/
len = sizeof("HTTP/1.x ") - 1 + sizeof(CRLF) - 1
/* the end of the header */
+ sizeof(CRLF) - 1;
/* status line */
if (r->headers_out.status_line.len) {
/*存在响应状态行信息 增加响应数据长度及获取状态行数据*/
len += r->headers_out.status_line.len;
status_line = &r->headers_out.status_line;
#if (NGX_SUPPRESS_WARN)
status = 0;
#endif
} else {
/*如果没有响应状态行数据*/
status = r->headers_out.status;
if (status >= NGX_HTTP_OK
&& status < NGX_HTTP_LAST_2XX)
{
/*响应的状态码是2XX*/
/* 2XX */
if (status == NGX_HTTP_NO_CONTENT) {
/*状态码表示没有内容 即响应为空*/
r->header_only = 1; //标记只有响应头而没有响应的包体
/*以下的数据无用 设置成无效值*/
ngx_str_null(&r->headers_out.content_type);
r->headers_out.last_modified_time = -1;
r->headers_out.last_modified = NULL;
r->headers_out.content_length = NULL;
r->headers_out.content_length_n = -1;
}
/*得到状态值的数组索引值*/
status -= NGX_HTTP_OK;
/*取得状态行数据*/
status_line = &ngx_http_status_lines[status];
/*增加需要发送的数据长度*/
len += ngx_http_status_lines[status].len;
} else if (status >= NGX_HTTP_MOVED_PERMANENTLY
&& status < NGX_HTTP_LAST_3XX)
{ /*如果响应的状态码是3XX*/
/* 3XX */
if (status == NGX_HTTP_NOT_MODIFIED) {
/*304内容无变化 只需要发送响应头即可*/
r->header_only = 1;
}
/*取得状态行的索引*/
status = status - NGX_HTTP_MOVED_PERMANENTLY + NGX_HTTP_OFF_3XX;
/*得到状态行的数据*/
status_line = &ngx_http_status_lines[status];