Skip to main content

响应头字段

概述

响应头字段(Response header)被用于 HTTP 响应中并且和响应主体无关的那一类 HTTP header。像 LocationServer 都属于响应头字段等。常见的响应头字段如下图所示:

图:HTTP响应头字段

tip

并非所有出现在响应头中的字段都是响应头字段,例如Content-Length就是一个代表响应体消息大小的实体头字段

Accept-Ranges

Accept-Ranges这个字段在请求头字段中Range中提到过,该字段用来告知客户端是否支持范围传输。当服务端支持范围请求时返回Accept-Ranges: bytes,当服务器没有实现范围请求功能时,返回Accept-Ranges: none或者不返回该字段。

Accept-Ranges 格式:

Accept-Ranges: bytes

Etag

Etag是一种可以将资源以字符串形式做唯一标识的方式。服务器会为每份资源分配对应的Etag。当资源发生更新时,Etag值也会更新。

Etag经常和请求头字段If-None-Match一起用来控制资源缓存,当If-None-Match的值与Etag的值相匹配时,表示命中协商缓存,否则代表缓存资源已经过期,浏览器会返回新的资源给客户端。

强 Etag 和弱 Etag

Etag分为强Etag和弱Etag,弱Etag使用W/来标示,如下所示:

强 Etag:

ETag: "<etag_value>"

弱 Etag:

ETag: W/"<etag_value>"

Etag只要资源发生任何改变都会立刻变化,而弱 Etag 则只有在资源发生本质变化的时候才会更新。弱Etag很容易生成,但不利于比较。强Etag是比较的理想选择,但很难有效地生成。相同资源的两个弱 Etag 值可能语义等同,但不是每个字节都相同。

Location

Location的作用是指定的是一个重定向请求的目的地址(3XX)或者新创建资源的 URI(201)。

当浏览器收到 301/302 报文,会检查响应头里有没有Location。如果有,就从字段值里提取出 URI,发出新的 HTTP 请求,相当于自动替我们点击了这个链接。

当响应报文的状态码为 201 时,也会带上 Location 首部,它表示新创建资源的 URI

Location: /index.html
Location: https://www.baidu.com/index.html
tip

Location 里的 URI 既可以使用绝对 URI,也可以使用相对 URI。但相对 URI 只能在站内跳转的时候使用

WWW-Authenticate

响应头字段WWW-Authenticate和请求头字段Authorization经常搭配使用,WWW-Authenticate 通常会和一个 401 Unauthorized 的响应一同被发送到客户端,此时客户端想要通过服务器身份认证再时需要添加请求头字段Authorization。如下图所示:

图:HTTP认证框架

关于 HTTP 访问认证可以参考HTTP authentication

Proxy-Authenticate

WWW-Authenticate不同的是,Proxy-Authenticate发出的是代理服务器。当客户端收到代理服务器发出的Proxy-Authenticate时,客户端想要通过服务器身份认证再时需要添加请求头字段Proxy-Authorization

Server

Server字段主要是告诉客户端当前正在提供 Web 服务的软件名称和版本号

例如:

Server: Apache/2.2.17

Vary

服务器在回复请求报文时,会根据请求报文中的Accept、Accept-*字段进行“内容协商”。同一个请求,经过内容协商后可能会有不同的字符集、编码、浏览器等版本,所以服务器会在响应头里多加一个Vary字段,记录服务器在内容协商时参考的请求头字段。每当 Accept 等请求头变化时,Vary 也会随着响应报文一起变化,也就是说,同一个 URI 可能会有多个不同的“版本”。

例如:

Vary: Accept-Encoding,User-Agent,Accept

这个 Vary 字段表示服务器依据了 Accept-EncodingUser-AgentAccept 这三个头字段,然后决定了发回的响应报文。

什么时候用 Vary

Vary主要用在传输链路中间的代理服务器实现缓存服务,代理服务器会对同一个 URL 可能会缓存多个“版本”的资源。

当客户端发送相同的请求时,代理就读取缓存里的Vary,对比请求头里相应的Accept-EncodingUser-Agent等字段,如果和Vary匹配,比如都是gzip、Chrome,就表示版本一致,可以返回缓存的数据。当比对不一致时,代理服务器需要先从源服务器获取资源,然后再将资源响应给客户端。

整体的流程如下图所示:

图:Vary功能图

其他字段

除了上述字段外还有Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Allow-Credentials等字段,这些Access-Control-Allow-*用在CORS跨域的预检请求对应的响应头中。关于这部分可以参考文档中关于CORS的内容。

参考资料