第6章 HTTP首部
6.1 http报文首部
6.2 http首部字段
http首部字段根据实际用途分为以下4种类型:
通用首部字段、请求首部字段、响应首部字段、实体首部字段(针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息)
6.3 HTTP/1.1 通用首部字段
cache-control: 取值比较常见的有no-cache,如果在响应头中,代表源服务器跟缓存服务器说,你可以使用缓存,但是每次使用都要通知我一下。如果在请求头中,代表客户端跟缓存服务器说,我不要缓存,你直接从源服务器上拿资源。
1.no-cache指令
2.no-store指令
代表传输的信息是保密的,不允许存储。
3.max-age指令
从客户端的角度:如果请求头中有max-age这个参数,那么,缓存服务器拿到参数后,会根据其值判断资源是否过期,如果过期,会向源服务器重新请求新的资源。
从源服务器角度:如果响应头中有max-age这个参数,那么,源服务器在告诉缓存服务器,我这个资源只要没过期,你都不用跟我要新的。
另外,cache-control可能的取值还有:max-stale、only-if-cache、must-revalidate、proxy-revalidate、no-transform
6.3.2 Connection
connection有2个作用:
1.控制不再转发给代理的首部字段
2.管理持久连接
6.3.3 Date字段
首部字段Date为创建报文的时间。
6.3.4 Pragma
这个字段是http1.1之前的遗留字段,为了兼容http1.0。一般用在客户端上,意思为告诉中间服务器,我不要缓存资源。
所有的中间服务器如果都能以 HTTP/1.1 为基准,那直接采用 Cache-Control: no-cache 指定缓存的处理方式是最为理想的。但要整体掌握全部中间服务器使用的 HTTP 协议版本却是不现实的。因此,发送的请求会同时含有下面两个首部字段。
Cache-Control: no-cache Pragma: no-cache
这个字段说明,在报文主体后有哪些重要字段,以免服务器忘记查看,一般用来分块传输。
6.3.6 Transfer-Encoding
6.3.7 Upgrade
客户端利用此字段询问服务端,能让我使用更高版本或者其他协议通信吗?
6.3.8 via
资源在各个代理服务器,或者中转服务器之间转发时,都会在报文头部加上此字段,以便用来追踪资源的踪迹。
6.3.9 warning
6.4 请求首部字段
6.4.1 accept
q表示权重,返回数据格式的优先级。
数据格式包括:文本、图片文件、视频文件、应用程序使用的二进制文件
6.4.2 accept-charset
通知服务器,可以接收的资源的字符集
6.4.3 accept-encoding
用户代理告诉服务器,是否可以把压缩过后的资源吐给他。
6.4.4 accept-language
告诉服务器,它想要的资源的语言
6.4.5 authorization
用户代理收到服务器返回的401之后,就知道,服务器需要验证信息才能把信息返回,这个时候,用户代理会在请求头上添加:Authorization字段。
6.4.6 Expect
使用实例:Expect: 100-continue
客户端通过这个字段告诉服务器,客户端希望服务器做出的回应,如果服务器无法理解客户端的意图,会返回417,表示expectation failed。等待100状态码的客户端在发送请求时,需要指定Expect: 100-continue
6.4.7 From
首部字段 From 用来告知服务器使用用户代理的用户的电子邮件地址。通常,其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。使用代理时,应尽可能包含 From 首部字段(但可能会因代理不同,将电子邮件地址记录在 User-Agent 首部字段内)。
6.4.8 Host
host 是http1.1请求中唯一一个被要求强制性的写在请求头中的字段。此字段为了解决以下问题:当客户端请求到达服务器的时候,host已经被解析成了ip,但是,如果同一个ip下分配了多个不同的域名(对应不同的虚拟主机),这个时候就无法判断,客户端需要哪个虚拟主机下的资源。
6.4.9 If-Match
形如if-xxx的请求,叫做条件请求,只有客户端的请求符合条件时,服务器才会执行请求。
If-Match: '123456'
服务器会将资源的ETag与客户端给的相比较,如果一样,那么会执行请求,将资源返回给客户端,否则会返回412 Precondition failed
6.4.10 If-Modified-Since
If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT
客户端跟服务器说:如果资源在2004-4-15 00:00:00之后,被更改过,就执行这个请求,返回资源。如果没有更改过,服务器就会返回304,not modified.
6.4.11 If-None-Match
客户端在告诉服务器,如果请求的资源的ETag与我发送的值不一致,那么你就处理请求,给我最新的资源。它的作用与If-Match相反。在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。因此,这与使用首部字段 If-Modified-Since 时有些类似。
6.4.12 If-Range
6.4.14 Max-Forwards
通过 TRACE 方法或 OPTIONS 方法,发送包含首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,Max-Forwards 的值减 1 后重新赋值。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发,而是直接返回响应。
使用 HTTP 协议通信时,请求可能会经过代理等多台服务器。途中,如果代理服务器由于某些原因导致请求转发失败,客户端也就等不到服务器返回的响应了。对此,我们无从可知。
可以灵活使用首部字段 Max-Forwards,针对以上问题产生的原因展开调查。由于当 Max-Forwards 字段值为0 时,服务器就会立即返回响应,由此我们至少可以对以那台服务器为终点的传输路径的通信状况有所把握。
Proxy-Authorization: Basic dGlwOjkpNLAGfFY5
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段 Proxy-Authorization 的请求,以告知服务器认证所需要的信息。
这个行为是与客户端和服务器之间的 HTTP 访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间。客户端与服务器之间的认证,使用首部字段 Authorization 可起到相同作用。有关 HTTP 访问认证,后面的章节会作详尽阐述。
Range: bytes=5001-10000
6.4.17 Referer
Referer: http://www.hackr.jp/index.htm
首部字段 Referer 会告知服务器请求的原始资源的 URI。
客户端一般都会发送 Referer 首部字段给服务器。但当直接在浏览器的地址栏输入 URI,或出于安全性的考
虑时,也可以不发送该首部字段。
因为原始资源的 URI 中的查询字符串可能含有 ID 和密码等保密信息,要是写进 Referer 转发给其他服务器,则有可能导致保密信息的泄露。
另外,Referer 的正确的拼写应该是 Referrer,但不知为何,大家一直沿用这个错误的拼写。
TE: gzip, deflate;q=0.5
首部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,但是用于传输编码。
首部字段 TE 除指定传输编码之外,还可以指定伴随 trailer 字段的分块传输编码的方式。应用后者时,只需把 trailers 赋值给该字段值。
TE: trailers
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1