HTTP 首部字段

一、HTTP 报文首部

HTTP 请求报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成。

HTTP 响应报文由HTTP版本、状态码(数字和原因短语)、HTTP首部字段3部分构成。

HTTP 协议的请求和响应报文中必定包含 HTTP 首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。

1、HTTP 首部字段结构

HTTP 首部字段是由首部字段名和字段值构成(首部字段名: 字段值 )。

例: 单个值 Content-Type: text/html
多个值 Keep-Alive: timeout=15, max=100

注: 当HTTP报文中出现了两个相同的字段时,有的浏览器会优先处理第一次出现的值,有的会优先处理最后出现的字段。

2、HTTP 首部字段类型

HTTP 首部字段根据实际用途被分为以下 4 种类型:

  • 通用首部字段(请求报文和响应报文两方都会使用的首部)。
  • 请求首部字段(从客户端向服务器端发送请求报文时使用的首部)。
  • 响应首部字段(从服务器端向客户端返回响应报文时使用的首部)。
  • 实体首部字段(针对请求报文和响应报文的实体部分使用的首部)。
3、HTTP/1.1 首部字段概览

通用首部字段

首部字段名

说明

Cache-Control

控制缓存的行为

Connection

逐跳首部、链接的管理

Date

创建报文的日期时间

Pragma

报文指令

Trailer

报文末端的首部一览

Transfer-Encoding

指定报文主体的传输编码方式

Upgrade

升级为其他协议

Via

代理服务器的相关信息

Warning

错误通知

请求首部字段

首部字段名

说明

Accept

用户代理可处理的媒体类型

Accept-Charset

优先的字符集

Accept-Encoding

优先的内容编码

Accept-Language

优先的语言(自然语言)

Authorization

Web认证信息

Expect

期待服务器的特定行为

From

用户的电子邮箱地址

Host

请求资源所在服务器

If-Match

比较实体标记(ETag)

If-Modified-Since

比较资源的更新时间

If-None-Match

比较实体标记(与 If-Match 相反)

If-Range

资源未更新时发送实体 Byte 的范围请求

If-Unmodified-Since

比较资源的更新时间(与If-Modified-Since相反)

Max-Forwards

最大传输逐跳数

Proxy-Authorization

代理服务器要求客户端的认证信息

Range

实体的字节范围请求

Referer

对请求中 URI 的原始获取方

TE

传输编码的优先级

User-Agent

HTTP 客户端程序的信息

响应首部字段

首部字段名

说明

Accept-Ranges

是否接受字节范围请求

Age

推算资源创建经过时间

ETag

资源的匹配信息

Location

令客户端重定向至指定URI

Proxy-Authenticate

代理服务器对客户端的认证信息

Retry-After

对再次发起请求的时机要求

Server

HTTP服务器的安装信息

Vary

代理服务器缓存的管理信息

WWW-Authenticate

服务器对客户端的认证信息

实体首部字段

首部字段名

说明

Allow

资源可支持的HTTP方法

Content-Encoding

实体主体适用的编码方式

Content-Language

实体主体的自然语言

Content-Length

实体主体的大小(单位:字节)

Content-Location

替代对应资源的URI

Content-MD5

实体主体的报文摘要

Content-Range

实体主体的位置范围

Content-Type

实体主体的媒体类型

Expires

实体主体过期的日期时间

Last-Modified

资源的最后修改日期时间

非 HTTP/1.1 首部字段
Cookie、Set-Cookie 和 Content-Disposition等。

二、HTTP/1.1 通用首部字段

1、Cache-Control

Cache-Control 能够控制缓存的行为。
Cache-Control 字段的参数是可选的,多个指令之间通过“,”分隔。 如: Cache-Control: private, max-age=0, no-cache
Cache-Control 字段请求参数:

指令

参数

说明

no-cache


强制向源服务器再次验证

no-store


不缓存请求或响应的任何内容

max-age = [ 秒]

必需

响应的最大Age值

max-stale( = [ 秒])

可省略

接收已过期的响应

min-fresh = [ 秒]

必需

期望在指定时间内的响应仍有效

no-transform


代理不可更改媒体类型

only-if-cached


从缓存获取资源

cache-extension

-

新指令标记(token)

Cache-Control 字段响应参数:

指令

参数

说明

public


可向任意方提供响应的缓存

private

可省略

仅向特定用户返回响应

no-cache

可省略

缓存前必须先确认其有效性

no-store


不缓存请求或响应的任何内容

no-transform


代理不可更改媒体类型

must-revalidate


可缓存但必须再向源服务器进行确认

proxy-revalidate


要求中间缓存服务器对缓存的响应有效性再进行确认

max-age = [ 秒]

必需

响应的最大Age值

s-maxage = [ 秒]

必需

响应的最大Age值

cache-extension

-

新指令标记(token)

Cache-Control: public
明确表明其他用户(cdn,代理服务器等)也可利用缓存。

Cache-Control: private
缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

Cache-Control: no-cache
请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应,代理服务必须向源服务器验证有效性。
响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。
总结来说就是 本地可以缓存,但是要向源服务进行验证,且中间节点不允许缓存。

Cache-Control: no-store
本地和任何一方都不能进行缓存,必须向源服务请求新资源。

Cache-Control: max-age=604800(单位:秒)
请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。(max-age 值为 0时,需要去请求源服务器)。
响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。

Cache-Control: s-maxage=604800(单位 :秒)
s-maxage 指令的功能和 max-age 指令的相同,会覆盖max-age指令但是只在公共缓存服务器中生效。
结合使用可以让我们针对私有缓存和公共缓存(例如代理、CDN)分别设定不同的刷新时间。

Cache-Control: min-fresh=60(单位:秒)
要求缓存服务器返回至少还未过指定时间的缓存资源。
比如,min-fresh 为 60 秒时,过了 60 秒的资源都无法作为响应返回。

Cache-Control: max-stale=3600(单位:秒)
使用 max-stale 指示缓存资源,即使过期也正常接收。
如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale指定的时间内,仍旧会被客户端接收。

Cache-Control: only-if-cached
该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。 若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout。

Cache-Control: must-revalidate
已过期的资源,再次向源服务确认资源的有效性。
也就是说即使max-stale指令要求即使资源过期也可以正常接受时,must-revalidate指令会忽略max-stale指令,再次向源服务确认资源的有效性。

Cache-Control: proxy-revalidate
要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

Cache-Control: no-transform
规定无论是在请求还是响应中,中间代理不得对该资源进行任何更改或转换。
可防止缓存或代理压缩图片等类似操作。

2、Connection

控制不再转发给代理的首部字段管理持久连接。
管理持久连接。

格式

Connection: 不再转发的首部字段名

使用 Connection 首部字段,可控制不再转发给代理的首部字段。

JAVA后端给请求头内加字段_http

Connection: close
在HTTP/1.1 版本的默认连接都是持久连接。客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection 首部字段的值为 Close。

Connection: Keep-Alive
HTTP/1.1 之前的 HTTP 版本的默认连接都是非持久连接。如果想在旧版本的 HTTP 协议上维持持续连接,则需要指定Connection 首部字段的值为 Keep-Alive。

3、Date

首部字段 Date 表明创建 HTTP 报文的日期和时间。

Date: Tue, 03 Jul 2012 04:40:59 GMT
HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式。

Date: Tue, 03-Jul-12 04:40:59 GMT
之前的 HTTP 协议版本中使用在 RFC850 中定义的格式。

Date: Tue Jul 03 04:40:59 2012
其他格式。与 C 标准库内的 asctime() 函数的输出格式一致。

4、 Pragma

该字段是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0的向后兼容而定义。

Pragma: no-cache
客户端会要求所有的中间服务器不返回缓存的资源。只存在于请求中。
如果代理服务器 都是HTTP/1.1版本直接使用 CacheControl: no-cache字段处理缓存即可,Pragma: no-cache作为兼容HTTP/1.1之前版本。

5、Trailer

首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。如:

JAVA后端给请求头内加字段_服务器_02


以上用例中,指定首部字段 Trailer 的值为 Expires,在报文主体之后(分块长度 0 之后)出现了首部字段 Expires。

6、 Transfer-Encoding

Transfer-Encoding: chunked
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。

7、 Upgrade

首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

Upgrade 首部字段产生作用的 Upgrade 对象仅限于客户端和邻接服务器之间。因此使用首部字段 Upgrade 时,还需要额外指定Connection:Upgrade。

8、Via

使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。

JAVA后端给请求头内加字段_JAVA后端给请求头内加字段_03

9、 Warning

告知用户一些与缓存相关的问题的警告。

Warning 首部的格式如下:Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])。

例: Warning: 113 gw.hackr.jp:8080 “Heuristic expiration” Tue, 03

HTTP/1.1版本Warning警告码:

警告码

警告内容

说明

110

Response is stale(响应已过期)

代理返回已过期的资源

111

Revalidation failed(再验证失败)

代理再验证资源有效性时失败(服务器无法到达等原因)

112

Disconnection operation(断开连接操作)

代理与互联网连接被故意切断

113

Heuristic expiration(试探性过期)

响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)

199

Miscellaneous warning(杂项警告)

任意的警告内容

214

Transformation applied(使用了转换)

代理对内容编码或媒体类型等执行了某些处理时

299

Miscellaneous persistent warning(持久杂项警告)

任意的警告内容

三、请求首部字段

请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。

1、 Accept

Accept: text/html,application/xhtml+xml,application/xml;q=0.3

Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。

可使用 type/subtype 这种形式,一次指定多种媒体类型。q 值来表示相对优先级。

2、Accept-Charset

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

Accept-Charset 首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。

可一次性指定多种字符集,q 值来表示相对优先级。

3、Accept-Encoding

Accept-Encoding: gzip;q=1.0, identity; q=0.5,

Accept-Encoding 首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。

可一次性指定多种内容编码。q 值来表示相对优先级。

编码的例子:

  • identity:不执行压缩或不会变化的默认编码格式 。
  • gzip: 由文件压缩程序 gzip(GNU zip)生成的编码格式。
  • compress: 由 UNIX 文件压缩程序 compress 生成的编码格式。
  • deflate: 组合使用 zlib格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。
4、Accept-Language

Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

首部字段 Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。

可一次指定多种自然语言集。q 值来表示相对优先级。

5、Authorization

Authorization: Basic dWVub3NlbjpwYXNzd29yZA==

首部字段 Authorization 是用来告知服务器,用户代理的认证信息(证书值)。

6、xpect

Expect: 100-continue

客户端使用首部字段 Expect 来告知服务器,期望出现的某种特定行为。

响应状态码 100 Continue。

7、From

首部字段 From 用来告知服务器使用用户代理的用户的电子邮件地址。

8、Host

Host: www.hackr.jp

首部字段 Host 会告知服务器,请求的资源所处的互联网主机名和端口号。

9、If-xxx

这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

If-Match
If-Match: “123456”

首部字段 If-Match会告知服务器匹配资源所用的实体标记(ETag)值,服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。(ETag:实体标记,是与特定资源关联的确定值。 )

If-Modified-Since
If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT

如果在 If-Modified-Since 字段指定的日期时间后,资源发生了更新,服务器会接受请求。

If-None-Match

用于指定 If-None-Match 字段值的实体标记(ETag)值与请求资源的 ETag 不一致时,告知服务器处理该请求。

它和首部字段 If-Match作用相反。

If-Range

告知服务器若指定的 IfRange 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。

If-Unmodified-Since
If-Unmodified-Since: Thu, 03 Jul 2012 00:00:00 GMT

告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。

它 和首部字段 If-Modified-Since 的作用相反。

10、Max-Forwards

Max-Forwards: 2

指定可经过的服务器最大数目。

服务器在往下一个服务器转发请求之前,Max-Forwards 的值减 1 后重新赋值,当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发,而是直接返回响应。

JAVA后端给请求头内加字段_服务器_04

11、Proxy-Authorization

Proxy-Authorization: Basic dGlwOjkpNLAGfFY5

接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization 的请求,以告知服务器认证所需要的信息。

12、Range

Range: bytes=5001-10000

首部字段 Range 可告知服务器获取资源的指定范围。上面的示例表示请求获取从第 5001 字节至第10000 字节的资源。

接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。

13、Referer

Referer: http://www.hackr.jp/index.htm

首部字段 Referer 会告知服务器请求的原始资源的 URI。

14、TE

TE: gzip, deflate;q=0.5

首部字段 TE 会告知服务器客户端能够处理响应的传输编码方式及相对优先级。

15、User-Agent

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gec

首部字段 User-Agent 会将创建请求的浏览器种类和用户代理名称等信息传达给服务器。

四、响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

1、Accept-Ranges

Accept-Ranges: bytes

首部字段 Accept-Ranges 是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。

bytes就是可处理范围请求, none就是不可处理。

2、Age

Age: 600 (单位: 秒)

首部字段 Age 能告知客户端,源服务器在多久前创建了响应。

3、ETag

ETag: “82e22293907ce725faf67773957acd12”

首部字段 ETag 能告知客户端实体标识。

它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag值。

4、Location

Location: http://www.usagidesign.jp/sample.html

首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。

该字段会配合 3xx :Redirection 的响应,提供重定向的URI,几乎所有的浏览器在接收到包含首部字段 Location 的响应后,都会强制性地尝试对已提示的重定向资源的访问。

5、Proxy-Authenticate

Proxy-Authenticate: Basic realm=“Usagidesign Auth”

首部字段 Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。

6、Retry-After

Retry-After: 120

首部字段 Retry-After 告知客户端应该在多久之后再次发送请求。

字段值可以指定为具体的日期时间(Wed, 04 Jul 2012 06:34:24GMT 等格式),也可以是创建响应后的秒数。

7、Server

Server: Apache/2.2.17 (Unix)

首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。

8、Vary

Vary: Accept-Language

首部字段 Vary 可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。

当代理服务器接收到带有 Vary 首部字段指定获取资源的请求时,如果使用的 Accept-Language 字段的值相同,那么就直接从缓存返回响应。反之,则需要先从源服务器端获取资源后才能作为响应返回。

9、WWW-Authenticate

WWW-Authenticate: Basic realm=“Usagidesign Auth”

首部字段 WWW-Authenticate 用于 HTTP 访问认证。

它会告知客户端适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)。

五、实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。

1、Allow

Allow: GET, HEAD

首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。

当服务器接收到不支持的 HTTP 方法时,会以状态码405作为响应返回。与此同时,还会把所有能支持的 HTTP 方法写入首部字段 Allow 后返回。

2、Content-Encoding

Content-Encoding: gzip

首部字段 Content-Encoding 会告知客户端服务器对实体的主体部分选用的内容编码方式。

内容编码是指在不丢失实体信息的前提下所进行的压缩。

主要采用以下 4 种内容编码的方式: gzip 、compress 、deflate 、identity。

3、Content-Language

Content-Language: zh-CN

首部字段 Content-Language 会告知客户端,实体主体使用的自然语言(指中文或英文等语言)。

4、Content-Length

Content-Length: 15000 (单位:字节)

首部字段 Content-Length 表明了实体主体部分的大小。

5、Content-Location

Content-Location: http://www.hackr.jp/index-ja.html

首部字段 Content-Location 给出与报文主体部分相对应的 URI。

它和首部字段 Location 不同,Content-Location 表示的是报文主体返回资源对应的 URI。

6、Content-MD5

Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==

首部字段 Content-MD5 是一串由 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。

客户端会对接收的报文主体执行相同的 MD5 算法,然后与首部字段 Content-MD5 的字段值比较。

7、Content-Range

Content-Range: bytes 5001-10000/10000 (单位: 字节)

返回响应时使用的首部字段 Content-Range,可以告知客户端作为响应返回的实体的哪个部分符合范围请求。

8、Content-Type

Content-Type: text/html; charset=UTF-8

首部字段 Content-Type 说明了实体主体内对象的媒体类型。

9、Expires

Expires: Wed, 04 Jul 2012 08:26:05 GMT

首部字段 Expires 会将资源失效的日期告知客户端。

当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。

注意:当首部字段 Cache-Control 有指定 max-age 指令时,会优先处理 max-age 指令。

10、Last-Modified

Last-Modified: Wed, 23 May 2012 09:59:55 GMT

首部字段 Last-Modified 指明资源最终修改的时间。

六、为 Cookie 服务的首部字段

管理服务器与客户端之间状态的 Cookie,没有被编入标准化HTTP/1.1 的 RFC2616 中,但在 Web 网站方面得到了广泛的应用。

1、Set-Cookie

Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31

属性

说明

NAME=VALUE

赋予 Cookie 的名称和其值(必需项)

expires=DATE

Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止)

path=PATH

将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)

domain=域名

作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie的服务器的域名)

Secure

仅在 HTTPS 安全通信时才会发送 Cookie

HttpOnly

加以限制,使 Cookie 不能被 JavaScript 脚本访问

2、Cookie

Cookie: status=enable

首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。

七、其他首部字段

HTTP 首部字段是可以自行扩展的。所以在 Web 服务器和浏览器的应用上,会出现各种非标准的首部字段。

1、X-Frame-Options

X-Frame-Options: DENY

首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。

其主要目的是为了防止点击劫持(clickjacking)攻击。

字段值如下:

  • DENY: 拒绝
  • SAMEORIGIN: 仅同源域名下的页面匹配时许可。
2、X-XSS-Protection

X-XSS-Protection: 1

首部字段 X-XSS-Protection 属于 HTTP 响应首部,用于控制浏览器 XSS 防护机制的开关。

主要是针对跨站脚本攻击(XSS)的一种对策。

字段值如下:

  • 0 :将 XSS 过滤设置成无效状态
  • 1 :将 XSS 过滤设置成有效状态
3、DNT

DNT: 1

首部字段 DNT 属于 HTTP 请求首部,表示拒绝个人信息被收集,拒绝被精准广告追踪的一种方法。

字段值如下:

  • 0 :同意被追踪
  • 1 :拒绝被追踪
4、P3P

P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa

首部字段 P3P 属于 HTTP 相应首部,通过利用 P3P(The Platform forPrivacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

P3P 的详细规范标准链接: http://www.w3.org/TR/P3P/