乐趣区

HTTP的各种首部Header

共四种首部

  • 通用首部
  • 请求首部
  • 响应首部
  • 实体首部
  • 非 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

两个作用:

  1. 客户端能够处理的编码方式及其优先级(压缩)

TE: gzip. deflate;q=0.5

  1. 配合实现分块传输编码

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
退出移动版