共计 3891 个字符,预计需要花费 10 分钟才能阅读完成。
共四种首部
- 通用首部
- 请求首部
- 响应首部
- 实体首部
- 非 HTTP/1.1 首部
非 HTTP/1.1 首部
Set-Cookie
- name=value
- expires= 日期时间。如果不指定,则默认为浏览器关闭为止。一旦发送到客户端就脱离了服务器的控制,服务端无法删除,只能覆盖。
- path=PATH 缓存的作用对象
- domain= 域名 缓存作用的域名,不指定则为创建 Cookie 的服务器
- Secure 只在 https 中才发送 Cookie
- HttpOnly Cookie 不能被 js 访问,防止 XSS 攻击。
- status=enable/disable
Cookie
Cookie: k=v;k2=v3
Content-Disposition
Content-Disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
Content-Disposition: attachment 以附件形式下载。
X-Frame-Options
属于响应首部
控制内容在其他 Web 网站的 Frame 标签的显示问题。
- DENY 拒绝,不允许其他站点 Frame 中引用
- SAMEORIGIN 同源策略
不指定的话,可以随便引用。
X-XSS-Proterction
属于响应首部
- 0 不保护
- 1 保护
DNT
属于请求首部,”Do Not Track” 的缩写
- 0 可以被追踪
- 1 拒绝被追踪
P3P
响应首部,“The Platform for Privacy Preferences”隐私偏好平台
根据是否是定义缓存代理的行为,分为两种、
- 端到端首部 End-to-end Header: 这类首部在转发时必须带着。
- 逐跳首部 Hop-by-hop Header:这类首部只对单次转发有效,会由于代理存在而不再转发。
逐跳首部:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
==注意下文中的 [] 内的 Q 和 R,分别表示指令可用于请求中或响应中。==
通用首部
Cache-Control
控制缓存服务器!
- public [R]公有缓存
- private [R]私有缓存,特定用户的缓存
- no-cache [QR]强制再次向源服务器验证
- no-store [QR]不缓存
- max-age [QR]缓存时间,单位秒
- s-max-age [R]缓存时间,单位秒
- max-stale [Q]过期时间只要不超过 max-stale 就可以接受。
- min-fresh [Q]只在请求中。如果缓存还有不到 min-fresh 的有效期,我就不要了,给我最新的,即当前时间 +min-fresh > 过期时间,则给我新的。
- only-if-cached [Q]只返回缓存,如果没有返回 504 Gateway Timeout
- must-revalidate [R]必须再次验证,如果无法连用源服务器,返回 504。此指令会忽略 max-stale。
- proxy-revalidate [R]客户端要求代理服务器必须再次验证。
- no-transform [QR]不允许缓存服务器改变媒体类型,比如压缩图片等。
- cache-extension [QR]扩展指令。
Connection
控制不再转发的首部
Upgrade: HTTP/1.1
Connection: Upgrade
表示转发时去掉 Upgrade 首部!
管理持久连接
Connection: Keep-Alive
关闭连接 Connection: Close
Date
此 http 报文的创建日期
Pragma
虽然属于通用首部,但只作用在发送请求时。
客户端要求不接受缓存,需要怎么设置?
如果中间服务器的版本都是 HTTP/1.1,只使用 Cache-Control: no-cache 即可。了解所有中间服务器的版本不太现实,所以最好加上
Pragma: no-cache。
Trailer 拖挂
用于分块传输编码中,在报文主体后可以拖挂首部。为什么要将首部放在主体后面呢?
- 拖挂的内容是可选的元数据,客户端不一定需要理解和使用(客户端可以忽略并丢弃拖挂中的内容)。
- trailer 首部是在最初的分块编码被加入到 HTTP/1.1 规范的草案之后才加入的,因此有些应用程序可能不理解这个首部
- 拖挂中可以包含附带的首部字段,它们的值在报文开始的时候可能是无法确定的(例如,必须要先生成主体的内容)。Content-MD5 首部就是一个可以在拖挂中发送的首部,因为在文档生成之前,很难算出它的 MD5。
- 除了 Transfer-Encoding、Trailer 以及 Content-Length 首部之外,其他 HTTP 首部都可以作为拖挂发送。
Transfer-Encoding: chunked
Trailer: Expires
(主体)
0
Expires: < 日期时间 >
Transfer-Encoding: chunked
Trailer: Content-MD5
(主体)
0
Content-MD5: xxxxx
Transfer-Encoding: chunked
只用于分块传输编码中!
Upgrade
属于逐跳首部,用于指定一个完全不同的通信协议,比如 TLS/1.0、WebSocket 等
服务器会返回 101 Switching Protocols
Via
用于追踪传输路径,每经过一个代理,会追加代理服务器信息。
还可以避免请求回环的发生,所以在经过代理时必须附加此首部。
一般和 Trace 方法和 Max-Forwards 首部一起使用。
Warning
告知用户一些与缓存相关的警告信息。
请求首部
Accept
客户端可接受的文件格式及其优先级
Accpet: text/html, text/plain; q=0.3
表示最好返回 html 格式的,如果没有的话返回 text 格式的也行。
可以指定权重,不指定的话默认是 1.0
Accept-Charset
字符集及其优先级
iso-8859-5, unicode-1-1; q=0.8
Accept-Encoding
内容编码方式及其优先级,主要指压缩格式
Accept-Encoding: gzip
- gzip
- compress
- deflate
- identity 不压缩
Accept-Language
可接受的语言
Authorization
客户端的认证信息
Expect
From
用户的联系方式
Host
在 http/1.1 中唯一一个必须包含在请求中的首部
用途:当服务器部署了多个域名的 Web 应用时,由于到达时域名已经换成了 IP,所以需要 Host 首部提供域名,用于区分不同的虚拟服务器。
If-Match
If-Match: “1234”
需要配合 ETag 使用:html 文件会标记 ETAG:1234。
如果匹配上了则正常返回,如果没有没有匹配上则返回:412 Precondition Failed 前提条件失败。
下面 4 个都是条件请求的首部
If-None-Match
If-Modified-Since
If-Unmodified-Since
If-Range
如果匹配上则执行范围请求,否则返回全部页面。
配合 Range 使用 Range: bytes=5001-10000
Max-Forwards
与 Trace 方法一起使用,控制经过的服务器的最大数目。
Referer
请求的原始 URI
TE
两个作用:
- 客户端能够处理的编码方式及其优先级(压缩)
TE: gzip. deflate;q=0.5
- 配合实现分块传输编码
TE: trailers, chunked
User-Agent
客户端信息
响应首部
Accept-Ranges
- bytes 支持范围请求
- none 不支持范围请求
Age
主要用于缓存代理服务器,代理服务器必须返回此首部
用于指示缓存是多久之前确认过的,单位秒
ETag
实体的标识
Etag 有强弱之分
强 Etag 值:微小的变化也会改变其值
弱 Etag 值:只有发生根本性变化才会改变,这时会以在开头附加 W/
Location
配合重定向状态,将页面引导到新的页面。
Proxy-Authenticate
代理认证
WWW-Authenticate
服务器认证
Retry-After
提示多久之后再重试请求,配合 503 服务不可用使用。
Server
服务器信息
Vary
提示缓存服务器,当什么首部相同时才返回缓存,如果不同,即使是请求的资源命中缓存也不使用!
Vary: Accept-Language 接收语言相同时才返回缓存。
实体首部
Allow
用于响应时,表达服务器允许的 HTTP 方法
如果不匹配,返回 405 Method Not Allowed
Content-Encoding
表明对方我已经按照这种编码方式进行了压缩。
Content-Language
告知客户端内容的语言
Content-Length
表明实体的主体部分的大小,单位是字节。
如果使用了内容编码传输(Content-Encoding)时,不能再使用此首部,因为已经进行了压缩。
Content-Location
主体内容的 URI
Content-MD5
客户端会对接收的主体执行相同的 MD5 算法,Base64, 比较值是否相等。
HTTP 首部不接受二进制值!
此机制是无法防止恶意篡改的,只能防止网络意外出错的验证。
Content-Range
Content-Range: bytes 5001-10000/10000
Content-Type
媒体类型
Content-Type: text/html; charset=UTF-8
Expires
服务器告诉缓存服务器,可以此资源缓存的截止时间
当无需要缓存时,将此值与 Date 首部的值设置成一样的。
缓存有效期的优先级:
- http1.0 版本:s-maxage > Expires > max-age
- http1.1 版本:s-maxage > max-age > Expires