6.1 HTTP 报文首部
HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。
HTTP 请求报文 :
HTTP 响应报文 :
注:首部字段同时存在于请求和响应报文内,并涵盖 HTTP 报文相关的内容信 息。
6.2 HTTP 首部字段
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容,起到传递额外重要信息的作用。
HTTP 首部字段结构 :
首部字段名: 字段值
例如:Content-Type: text/html;Keep-Alive: timeout=15, max=100
若 HTTP 首部字段重复了会如何 ?
答:这种情况在规范内尚未明确,根据浏览器内部处理逻辑的不同,结果可能并不一致。
4 种 HTTP 首部字段类型:
- 通用首部字段:请求报文和响应报文两方都会使用的首部。
- 请求首部字段:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
- 响应首部字段:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加 内容,也会要求客户端附加额外的内容信息。
- 实体首部字段:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更 新时间等与实体有关的信息。
端到端首部和逐跳首部 :
HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型:
- 端到端首部:分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
- 逐跳首部:分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。(使用它需提供 Connection 首部字段)
在 HTTP/1.1 中,除这 8 个首部字段之外, 其他所有字段都属于端到端首部:Connection,Keep-Alive,Proxy-Authenticate,Proxy-Authorization,Trailer ,TE ,Transfer-Encoding,Upgrade 。
6.3 HTTP/1.1 通用首部字段
通用首部字段是指请求报文和响应报文双方都会使用的首部。
- Cache-Control:操作缓存的工作机制
- Connection:作用有两个: 1.控制不再转发给代理的首部字段 2.管理持久连接
控制不再转发给代理的首部字段:
管理持久连接:
HTTP/1.1 版本的默认连接都是持久连接。当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close。
- Date:表明创建 HTTP 报文的日期和时间
- Pragma: HTTP/1.1 之前版本的历史遗留字段,仅作为与HTTP/1.0 的向后兼容而定义。
规范定义的形式唯一:Pragma: no-cache
该首部字段属于通用首部字段,但只用在客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源。
- Trailer:说明在报文主体后记录了哪些首部字段
- Transfer-Encoding:规定了传输报文主体时采用的编码方式
- Upgrade :用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议
- Via:为了追踪客户端与服务器之间的请求和响应报文的传输路径
报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发
- Warning:告知用户一些与缓存相关的问题的警告
HTTP/1.1 警告码:
6.4 请求首部字段
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段, 用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等 内容。
- Accept:通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
- Accept-Charset:通知服务器用户代理支持的字符集及字符集的相对优先顺序
- Accept-Encoding:告知服务器用户代理支持的内容编码及内容编码的优先级顺序
- Accept-Language:告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。
- Authorization:告知服务器用户代理的认证信息(证书值)
- Expect:告知服务器期望出现的某种特定行 为
- From:告知服务器使用用户代理的用户的电子邮件地 址
- Host:告知服务器请求的资源所处的互联网主机名和端口号
- If-Match:只有当 If-Match 的字段值跟 ETag 值匹配一致时,服务器才会接受请求
- If-Modified-Since:告知服务器若 IfModified-Since 字段值早于资源的更新时间,则希望能处理该请求
- If-None-Match:只有在 If-None-Match 的字段值与 ETag 值不一致时,可处理该请求
- If-Range:告知服务器若指定的 IfRange 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。
- If-Unmodified-Since:指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求
- Max-Forwards:每次转发数值减 1,当数值变 0 时返回响应
- Proxy-Authorization:告知服务器认证所需要的信息
- Range:告知服务器资源的指定范围
- Referer:告知服务器请求的原始资源的 URI
- TE:告知服务器客户端能够处理响应的传输编码方式及相对优先级
- User-Agent:用于传达浏览器的种类
6.5 响应首部字段
响应首部字段是由服务器端向客户端返回响应报文中所使用的字段, 用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等 信息。
- Accept-Ranges:用来告知客户端服务器是否能处理范围请求
- Age:告知客户端,源服务器在多久前创建了响应;若创建该响应的服务器是缓存服务器,Age 值是指缓存后的响应再次发起认证到认证完成的时间值
- ETag:告知客户端实体标识
它是一种可将资源以字符串 形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag 值。
当资源更新时,ETag 值也需要更新。生成 ETag 值时,并没有统一的算法规则,而仅仅是由服务器来分配。
ETag 中有强 ETag 值和弱 ETag 值之分。
- 强 ETag 值 :不论实体发生多么细微的变化都会改变其值。
- 弱 ETag 值 :只有资源发生了根本改变,产 生差异时才会改变 ETag 值
- Location:将响应接收方引导至某个与请求 URI 位置不同的资源
- Proxy-Authenticate:把由代理服务器所要求的认证信息发送给客户端。
- Retry-After:告知客户端应该在多久之后再次发送请求
- Server:告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息
- Vary:可对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令。
- WWW-Authenticate:用于 HTTP 访问认证
6.6 实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。
- Allo:用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法
- Content-Encoding:告知客户端服务器对实体的主体部分选用的内容编码方式
内容编码是指在不丢失实体信息的前提下所进行的压缩。
主要采用 4 种内容编码的方式:gzip,compress,deflate,identity
- Content-Language:告知客户端,实体主体使用的自然语言(指中文或英文等语言)
- Content-Length:表明了实体主体部分的大小(单位是字节)
对实体主体进行内容编码传输时,不能再使用 Content-Length 首部字段。
- Content-Location:报文主体返回资源对应的 URI
- Content-MD5:一串由 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达
- Content-Range:告知客户端作为响应返回的实体的哪个部分符合范围请求
- Content-Type:说明了实体主体内对象的媒体类型
- Expires:将资源失效的日期告知客户端。
缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,在 Expires 字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
但是,当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。
- Last-Modified:指明资源最终修改的时间
6.7 为 Cookie 服务的首部字段
Cookie 的工作机制是用户识别及状态管理,网景通信公司设计并开发了 Cookie,并制定相关的规格标准。
与 Cookie 有关的首部字段:
Set-Cookie:
Set-Cookie 字段的属性:
Cookie:
首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个 Cookie 时,同样可以以多个 Cookie 形式发送。
6.8 其他首部字段
HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和浏览器的应用上,会出现各种非标准的首部字段。
常用的首部字段:
- X-Frame-Options :属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。
主要目的是为了防止点击劫持攻击。
两个可指定的字段值:DENY :拒绝 SAMEORIGIN :仅同源域名下的页面匹配时许可
- X-XSS-Protection:属于 HTTP 响应首部,它是针对跨站脚本攻击的一种对策,用于控制浏览器 XSS 防护机制的开关。
可指定的字段值: 0 :将 XSS 过滤设置成无效状态 1 :将 XSS 过滤设置成有效状态
- DNT:属于 HTTP 请求首部,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
可指定的字段值: 0 :同意被追踪 1 :拒绝被追踪
- P3P:属于 HTTP 响应首部,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。