这里主要的头的处理是放在filter中做的,我们首先来看config(默认情况)后,nginx的obj目录下的ngx_modules.c这个文件中的关于filter的部分:
接下来就要按照顺序来一个个的分析这些filter的处理流程. 而一般来说客户端的If-Modified-Since这个时间值是server通过Last-Modified这个头传递过去的,这里要注意,只有http 1.1才要求无论如何都要传递这个头。 下面是RFC中对于这个头如何执行的一个描述:
接下来就来看nginx是如何做的,这个filter只有header的,通过上面的描述我们能看到他是不需要body filter的。
最后还有一个就是if-range和if_modified_since一起使用的时候会有些小变化,等下面分析range filter时候再来看这个。 第二个是 range filter ,它主要是用来处理If-Range和range这两个头的,他们主要是用于断点下载的,其中client请求使用range这个头,用于表示请求的内容的范围,而If-Range主要来实现range请求的if_modified_since的功能,下面代码我将会分析到. 而这里server生成Content-Range用于表示返回给client的信息。具体头的格式可以去看rfc文档。如果请求执行成功,server返回的是206,而如果请求的range有误,则会返回一个416. 而当请求有If-Range这个头时,则返回值有所不同的,当If-Range对应的etag或者date被匹配成功时,也就说明在上次请求之后还没被修改,此时返回206,而当不匹配时,则直接返回一个200.并返回整个文件.还有一个要注意的地方就是server发送给client有可能会一次返回多个部分. 下面这段是nginx里面的注释,描述的很清晰,对于多个部分和单个部分。不过nginx里面只有当整个body都在一个buf里面才支持多个range的。
然后来看nginx的实现.
接下来是headers_filter,这个filter主要是处理expires头以及添加一些自定义的头,这里我们主要来看expires的头。
在nginx中如果设置expires命令的话,nginx会同时设置expire头和cache-control头.这里有一个要注意的就是cache-control的max-age=0和no-cache的区别。 这里主要来看nginx如何设置expire的,这里nginx的expires命令可以设置4类参数,分别为:epoch,max,off以及超时时间.对应的cache-control的值为no-cache,10y. off的话直接跳过这个filter,数值的话就是赋值给max-age.并且nginx是同时设置expire和cache-control.这是为了防止有的http 1.0没有实现cache-control. 而且nginx的expire命令的date也分好几类,这些具体可以去看nginx的wiki的描述。
(责任编辑:IT) |