nginx 处理http(发送http响应头数据篇 ----- ngx_http_header_filter_module模块处理)

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];
            
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值