HTTP 协议的请求和响应报文中必定包含HTTP 首部,只是我们平时在使用Web 的过程中感受不到它。本章我们一起来学习HTTP首部的结构,以及首部中各字段的用法。
6.1 HTTP报文首部
首部内容为客户端和服务器分别处理和响应提供所需要的信息。
HTTP请求报文
在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-miOosmcK-1678848313956)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220830105153052.png)]
HTTP响应报文
在响应中,HTTP 报文由HTTP 版本、状态码(数字和原因短语)、HTTP 首部字段3 部分构成。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G27qCPoi-1678848313957)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220830105400613.png)]
6.2 HTTP首部字段
6.2.1 HTTP首部字段传递重要信息
传递额外重要信息
6.2.2 HTTP首部字段结构
首部字段名:字段值
6.2.3 4中HTTP首部字段类型
通用首部字段(General Header Fields)
请求首部字段(Request Header Fields)
响应首部字段(Response Header Fields)
实体首部字段(Entity Header Fields)
6.2.4 HTTP/1.1 首部字段一览
HTTP/1.1 规范定义了如下47 种首部字段。
6.2.5 非HTTP/1.1首部字段
在HTTP 协议通信交互中使用到的首部字段,不限于RFC2616 中定义的47 种首部字段。还有Cookie、Set-Cookie 和Content-Disposition等在其他RFC 中定义的首部字段,它们的使用频率也很高。
6.2.6 End-to-end首部和Hop-by-hop首部
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分为2种类型
端到端首部
分在此类别中的首部会转发给请求/ 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
逐跳首部
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用hop-by-hop 首部,需提供Connection 首部字段。
●●Connection
●●Keep-Alive
●●Proxy-Authenticate
●●Proxy-Authorization
●●Trailer
●●TE
●●Transfer-Encoding
●●Upgrade
其他所有字段都属于端到端首部
6.3 HTTP/1.1 通用首部字段
6.3.1 Cache-Control
通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制
指令的参数是可选的,多个指令之间通过,分隔
Cache-Control:private,max-age=0,no-cache
6.3.2 Connection
- 控制不再转发给代理的首部字段
- 管理持久连接
6.3.3 Date
表明创建HTTP报文的日期和时间
6.3.4 Pragma
Pragma 是HTTP/1.1 之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义。
属于通用首部字段,但只用在客户端发送的请求中。
6.3.5 Trailer
首部字段Trailer 会事先说明在报文主体后记录了哪些首部字段
6.3.6 Transfer-Encoding
规定传输报文主体时采用的编码方式
仅对分块传输编码有效
6.3.7 Upgrade
首部字段Upgrade 用于检测HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
6.3.8 Via
追踪客户端与服务器之间的请求和响应报文的传输路径
6.3.9 Warning
该首部通常会告知用户一些与缓存相关的问题的警告。
6.4 请求首部字段
用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容
6.4.1 Accept
通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
使用type/subtype这种形式,一次指定多种媒体类型
-
文本文件
text/html,text/plain,text/css…
application/xhtml+xml,application/xml…
-
图片文件
image/jpeg,image/gif,image/png…
-
视频文件
video/jpeg,image/gif,image/png…
-
应用程序使用的二进制文件
application/octet-stream,aplication/zip…
使用q=来额外表示权重值,用分号(;)进行分隔,范围是0~1,默认1.0最大
6.4.2 Accept-Charset
通知服务器用户代理支持的字符集及字符集的相对优先顺序
可一次指定多种字符集
采用权重q来表示优先级
6.4.3 Accept-Encoding
Accept-Encoding: gzip,deflate
告知服务器用户代理支持的内容编码及内容编码的优先级
可一次指定多种内容编码
- gzip
- compress
- default
- identity
采用权重q来表示优先级
可用星号*作为通配符,指定任意的编码格式
6.4.4 Accept-Language
首部字段Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。
q来表示相对优先级
6.4.5 Authorization
用户代理的认证信息(认证值)
6.4.6 Expect
告知服务器,期望出现某种特定的行为。
因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed
6.4.7 From
使用用户代理的用户的电子邮箱地址
6.4.8 Host
虚拟主机在用一个IP,需要添加HOST进行区分。
6.4.9 If-Match
条件请求
服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
6.4.10 If-Modified-Since
If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段Last-Modified 来确定
6.4.11 If-None-Match
与If-Match作用相反
在GET 或HEAD 方法中使用首部字段If-None-Match 可获取最新的资源。因此,这与使用首部字段If-Modified-Since 时有些类似
6.4.12 If-Range
首部字段If-Range 属于附带条件之一。它告知服务器若指定的If-Range 字段值(ETag 值或者时间)和请求资源的ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。
6.4.13 If-Unmodified-Since
告知服务器,指定的请求资源在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。
如果在指定日期时间后发生了更新,则以状态码412 Precondition Failed作为响应返回
6.4.14 Max-Forwards
该字段以十进制整数形式指定可经过的服务器最大数目
6.4.15 Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization 的请求,以告知服务器认证所需要的信息。
6.4.16 Range
获取部分资源的范围请求
处理成功返回状态码 206 Partial Content
处理失败,返回状态码200 OK 及全部内容
6.4.17 Referer
告知服务器请求的原始资源URI
客户端一般都会发送Referer 首部字段给服务器。但当直接在浏览器的地址栏输入URI,或出于安全性的考虑时,也可以不发送该首部字段。因为原始资源的URI 中的查询字符串可能含有ID 和密码等保密信息,要是写进Referer 转发给其他服务器,则有可能导致保密信息的泄露。
6.4.18 TE
告知服务器客户端能够处理响应的传输编码方式及相对优先级。
6.4.19 User-Agent
将创建请求的浏览器和用户代理名称等信息传达给服务器
6.5 响应首部字段
由服务器端向客户端返回响应报文种所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
6.5.1 Accept-Ranges
告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源
可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none。
6.5.2 Age
能告知客户端,源服务器在多久前创建了响应。单位为秒
6.5.3 ETag
资源更新后,ETag值会随之改变
首部字段能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag 值。
强ETag值和弱ETag值
强ETag值
无论实体发生多么细微的变化都会改变其值
弱ETag值
弱ETag值只用于提示资源是否相同。只有资源发生了根本变化,产生差异时才会改变ETag值
6.5.4 Location
将响应接收方引导至某个与请求URI位置不同的资源
基本上,该字段会配合3xx :Redirection 的响应,提供重定向的URI。
6.5.5 Proxy-Authenticate
首部字段Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。
6.5.6 Retry-After
首部字段Retry-After 告知客户端应该在多久之后再次发送请求。
主要配合状态码503 Service Unavailable响应或3xx Redirect响应一起使用
字段值可以指定具体的时间,也可以是创建响应后的秒数
6.5.7 Server
告知客户端当前服务器上安装的HTTP服务器应用程序的信息
6.5.8 Vary
可对缓存进行控制
当代理服务器接收到带有Vary 首部字段指定获取资源的请求时,如果使用的Accept-Language 字段的值相同,那么就直接从缓存返回响应。反之,则需要先从源服务器端获取资源后才能作为响应返回
6.5.9 WWW-Authenticate
用于HTTP访问认证。
它会告知客户端适用于访问请求URI 所指定资源的认证方案(Basic 或是Digest)和带参数提示的质询(challenge)。状态码401 Unauthorized 响应中,肯定带有首部字段WWW-Authenticate
6.6 实体首部字段
包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息
6.6.1 Allow
通知客户端能够支持Request-URI指定资源的所有HTTP方法
当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回
会把所有能支持的HTTP方法写入首部字段Allow后返回
6.6.2 Content-Encoding
告知客户端服务器对实体的主体部分选用的内容编码方式。
内容编码是指在不丢失实体信息的前提下所进行的压缩。
- gzip
- compress
- deflate
- identity
6.6.3 Content-Language
告知服务器,实体主体使用的自然语言
6.6.4 Content-Length
实体主体部分的大小(单位字节)
6.6.5 Content-Location
给出与报文主体部分相对应的URI
6.6.6 Content-MD5
首部字段Content-MD5 是一串由MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
6.6.7 Content-Range
针对范围请求,返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求
6.6.8 Content-Type
说明了实体主体内对象的媒体类型。
字段值用type/subtype形式赋值
参申诉charset使用iso-8859-1或euc-jp等字符集进行赋值
6.6.9 Expires
将资源失效的日期告知客户端。
6.6.10 Last-Modified
指明资源最后修改的时间
6.7为Cookie服务的首部字段
管理服务器与客户端之间状态的Cookie
Cookie的用户机制是用户识别及管理状态
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的Cookie信息 | 响应首部字段 |
Cookie | 服务器接收到的Cookie信息 | 请求首部字段 |
6.7.1 Set-Cookie
Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; ⇒
path=/; domain=.hackr.jp;
属性 | 说明 |
---|---|
NAME=VALUE | 赋予Cookie的名称和其值(必须项) |
expires=DATA | Cookie的有效期(若不明确指定则默认为浏览器关闭前为止) |
path=PATH | 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录) |
domain=域名 | 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名) |
Secure | 仅在HTTPS安全通信时才会发送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript脚本访问 |
6.7.2 Cookie
Cookie :status=enable
6.8 其他首部字段
可自行扩展
在Web服务器和浏览器的应用上,会出现个各种非标准的首部字段
6.8.1 X-Frame-Options
X-Frame-Options: DENY
属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。主要目的是为了防止点击劫持(clickjacking)攻击
- DENY 拒绝
- SAMEORIGIN 仅同源域名下的页面匹配时许可
6.8.2 X-XSS-Protection
属于HTTP响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
- 0:将XSS过滤设置为无效状态
- 1:将XSS过滤设置成有效状态
6.8.3 DNT
属于HTTP请求首部
DNT是Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
- 0:同意被追踪
- 1:拒绝被追踪
由于首部字段DNT的功能具备有效性,所以WEB服务器需要对DNT做对应的支持
6.8.4 P3P
属于HTTP响应首部
通过利用P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
要进行P3P的设定,需按以下操作步骤进行“
- 创建P3P隐私
- 创建P3P隐私对照文件后,保存命名在/w3c/p3p.xml
- 从P3P隐私中新建Compact policies后,输出到HTTP响应中
对策,用于控制浏览器XSS防护机制的开关。
- 0:将XSS过滤设置为无效状态
- 1:将XSS过滤设置成有效状态
6.8.3 DNT
属于HTTP请求首部
DNT是Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
- 0:同意被追踪
- 1:拒绝被追踪
由于首部字段DNT的功能具备有效性,所以WEB服务器需要对DNT做对应的支持
6.8.4 P3P
属于HTTP响应首部
通过利用P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
要进行P3P的设定,需按以下操作步骤进行“
- 创建P3P隐私
- 创建P3P隐私对照文件后,保存命名在/w3c/p3p.xml
- 从P3P隐私中新建Compact policies后,输出到HTTP响应中