HTTP标头字段提供有关请求或响应的所需信息,或有关在消息正文中发送的对象的信息。HTTP消息头有四种类型 -
- 通用标头 - 这些标头字段具有用于请求和响应消息的一般适用性。
- 客户端请求标头 - 这些标头字段仅适用于请求消息。
- 服务器响应标头 - 这些标头字段仅适用于响应消息。
- 实体标头 - 这些标头字段定义有关实体主体的元信息,或者如果主体不存在,则定义元信息。
1. 通用标头
下面让我们详细介绍通用标头。
Cache-control
Cache-Control
字段用于指定所有缓存系统必须遵守的指令。语法如下 -
Cache-Control : cache-request-directive|cache-response-directive
HTTP客户端或服务器可以使用Cache-control
通用标头来指定缓存的参数或从缓存中请求某些类型的文档。缓存指令在逗号分隔列表中指定。例如 -
Cache-control: no-cache
客户端在HTTP请求中可以使用以下重要的缓存请求指令 -
编号 | 指令 | 描述 |
---|---|---|
1 | no-cache |
如果未成功重新验证源服务器,则缓存不得使用响应来满足后续请求。 |
2 | no-store |
缓存不应存储有关客户端请求或服务器响应的任何内容。 |
3 | max-age = seconds |
表示客户端愿意接受时长不大于指定时间(秒)的响应。 |
4 | max-stale [ = seconds ] |
表示客户端愿意接受超过其到期时间的响应。如果给出秒数,则不得超过该时间。 |
5 | min-fresh = seconds |
表示客户端愿意接受其新生命周期不小于其当前时长加上指定时间(秒)的响应。 |
6 | no-transform |
不要转换实体主体。 |
7 | only-if-cached |
不要检索新数据。缓存只有在缓存中才能发送文档,并且不应该联系源服务器以查看是否存在较新的副本。 |
服务器在其HTTP响应中可以使用以下缓存响应指令 -
编号 | 缓存请求指令 | 描述 |
---|---|---|
1 | public |
表示任何缓存都可以缓存响应。 |
2 | private |
指示响应消息的全部或部分内容仅供单个用户使用,并且不得由共享高速缓存进行高速缓存。 |
3 | no-cache |
如果未成功重新验证源服务器,则高速缓存不得使用响应来满足后续请求。 |
4 | no-store |
缓存不应存储有关客户端请求或服务器响应的任何内容。 |
5 | no-transform |
不要转换实体主体。 |
6 | must-revalidate |
缓存必须在使用之前验证过时文档的状态,并且不应使用过期文档。 |
7 | proxy-revalidate |
proxy-revalidate 指令与must-revalidate 指令具有相同的含义,但它不适用于非共享用户代理缓存。 |
8 | max-age = seconds |
表示客户端愿意接受时长不大于指定时间(秒)的响应。 |
9 | s-maxage = seconds |
此指令指定的最大时长将覆盖max-age 指令或Expires 标头指定的最大期限。私有缓存始终忽略s-maxage 指令。 |
Connection
Connection
字段允许发送方指定该特定连接所需的选项,并且不能由代理通过其他连接进行通信。以下是使用连接头的简单语法 -
Connection : "Connection"
HTTP/1.1
定义了“关闭”连接选项,发送方在完成响应后发出连接将被关闭的信号。例如 -
Connection: close
默认情况下,HTTP 1.1使用持久连接,其中连接在事务后不会自动关闭。另一方面,HTTP 1.0
默认情况下没有持久连接。如果1.0客户端希望使用持久连接,则它使用keep-alive
参数,如下所示 -
Connection: keep-alive
Date
所有HTTP日期/时间戳必须以格林威治标准时间(GMT)表示。允许HTTP应用程序使用以下三种日期/时间戳表示 -
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
这里的第一种格式是最优选的格式。
Pragma
Pragma
字段用于包含可能适用于请求/响应链中任何收件人的特定于实现的指令。例如 -
Pragma: no-cache
HTTP/1.0
中定义的唯一指令是no-cache
指令,并在HTTP/1.1中维护以实现向后兼容。将来不会定义新的Pragma
指令。
Trailer
Trailer
字段值指示给定的标头字段集存在于用分块传输编码编码的消息的尾部中。以下是使用Trailer
标头字段的简单语法 -
Trailer : field-name
Trailer
标头字段中列出的消息标头字段不得包含以下标头字段 -
Transfer-Encoding
Content-Length
Trailer
Transfer-Encoding
Transfer-Encoding
标头字段指示已对消息正文应用了哪种类型的转换,以便在发件人和收件人之间安全地进行转换。这与内容编码不同,因为传输编码是消息的属性,而不是实体主体的属性。以下语法显示使用Transfer-Encoding
标头字段 -
Transfer-Encoding: chunked
所有传输编码值都不区分大小写。
Upgrade
Upgrade
标头允许客户端指定它支持的其他通信协议,并且如果服务器发现它适合切换协议,则希望使用它们。例如 -
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Upgrade
头字段旨在提供一种从HTTP/1.1
转换到其他不兼容协议的简单机制。
Via
网关和代理必须使用Via通用标头来指示中间协议和接收方。例如,可以将请求消息从HTTP/1.0
用户代理发送到代号为fred
的内部代理,该代理使用HTTP/1.1
将请求转发到nowhere.com
上的公共代理,该代理完成请求 通过https://www.ics.uci.edu/
将其转发到源服务器。www.ics.uci.edu
收到的请求将具有以下Via
头字段 -
Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Upgrade
标头字段旨在提供一种从HTTP/1.1
转换到其他不兼容协议的简单机制
Warning
Warning
通用标头用于携带有关消息状态或转换的其他信息,这些信息可能不会反映在消息中。响应可能带有多个警告标头。
Warning : warn-code SP warn-agent SP warn-text SP warn-date
2. 客户请求标头
Accept
Accept
请求标头字段可用于指定响应可接受的某些媒体类型。以下是一般语法 -
Accept: type/subtype [q = qvalue]
可以用逗号分隔多种媒体类型,可选的qvalue
代表0
到1
等级的接受类型的可接受质量等级。以下是一个示例 -
Accept: text/plain; q = 0.5, text/html, text/x-dvi; q = 0.8, text/x-c
这将被解释为text/html
和text/x-c
是首选媒体类型,但如果它们不存在,则发送text/x-dvi
实体,如果不存在,则发送text/plain
实体。
Accept-Charset
Accept-Charset
请求标头字段可用于指示响应可接受的字符集。以下是一般语法 -
Accept-Charset: character_set [q = qvalue]
可以用逗号分隔多个字符集,可选的qvalue
表示非优先字符集的可接受质量级别,范围为0
到1
。以下是一个示例 -
Accept-Charset: iso-8859-5, unicode-1-1; q = 0.8
特殊值*
(如果存在于Accept-Charset
字段中)与每个字符集匹配,如果不存在Accept-Charset
标头,则默认值为任何字符集都可接受。
Accept-Encoding
Accept-Encoding
请求标头字段类似于Accept
,但限制响应中可接受的内容编码。以下是一般语法 -
Accept-Encoding: encoding types
以下是示例 -
Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q = 0.5, gzip;q = 1.0
Accept-Encoding: gzip;q = 1.0, identity; q = 0.5, *;q = 0
Accept-Language
Accept-Language
请求标头字段与Accept
类似,但限制首选的自然语言集作为对请求的响应。以下是一般语法 -
Accept-Language: language [q = qvalue]
可以用逗号分隔多种语言,可选的qvalue
表示非优选语言的可接受质量级别,范围为0
到1
。以下是一个示例 -
Accept-Language: da, en-gb;q = 0.8, en;q = 0.7
Authorization
Authorization
请求标头字段值包含包含所请求资源领域的用户代理的认证信息的凭证。以下是一般语法 -
Authorization : credentials
HTTP/1.0
规范定义了BASIC授权方案,其中授权参数是username:password
以base 64编码的字符串。以下是一个示例 -
Authorization: BASIC Z3Vlc3Q6Z3Vlc3QxMjM =
值解析为guest:guest123
,其中guest
是用户ID,guest123
是密码。
Cookie
Cookie
请求标头字段值包含为该URL存储的名称/值对信息。以下是一般语法 -
Cookie: name = value
可以用分号分隔多个cookie
,如下所示 -
Cookie: name1 = value1;name2 = value2;name3 = value3
Expect
Expect
请求标头字段用于指示客户端需要特定的服务器行为。以下是一般语法 -
Expect : 100-continue | expectation-extension
如果服务器收到包含Expect
字段的请求,该字段包含它不支持的期望扩展,则它必须以417(期望失败)状态响应。
From
From
请求标头字段包含控制请求用户代理的人类用户的Internet电子邮件地址。以下是一个简单的例子 -
From: webmaster@w3.org
From
请求标头字段可以用于记录目的,并且可以用作识别无效或不需要的请求的源的手段。
Host
Host
请求标头字段用于指定所请求资源的Internet主机和端口号。以下是一般语法 -
Host : "Host" ":" host [ ":" port ] ;
没有任何尾随端口信息的主机则使用默认端口,即80
。例如,原始服务器上http://www.w3.org/pub/WWW/
的请求将是 -
GET /pub/WWW/ HTTP/1.1
Host: www.w3.org
If-Match
If-Match
请求标头字段与方法一起使用以使其成为条件。仅当此标记中的给定值与ETag
表示的给定实体标记匹配时,此标头才请求服务器执行所请求的方法。以下是一般语法 -
If-Match : entity-tag
星号(*
)匹配任何实体,仅当实体存在时,事务才会继续。以下是可能的例子 -
If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *
如果没有实体标签匹配,或者如果给出*
并且不存在当前实体,则服务器不能执行所请求的方法,并且必须返回412(Precondition Failed)响应。
If-Modified-Since
If-Modified-Since
请求标头字段与方法一起使用以使其成为条件。如果自该字段中指定的时间以来未请求修改请求的URL,则不会从服务器返回实体; 相反,将返回304(未修改)响应,而不返回任何消息体。以下是一般语法 -
If-Modified-Since : HTTP-date
另一个示例如下 -
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
如果没有实体标签匹配,或者如果给出*
并且不存在当前实体,则服务器不能执行所请求的方法,并且必须返回412(Precondition Failed)响应。
If-None-Match
If-None-Match
请求标头字段与方法一起使用以使其成为条件。仅当此标记中的给定值之一与ETag
表示的给定实体标记匹配时,此标头才请求服务器执行所请求的方法。以下是一般语法 -
If-None-Match : entity-tag
星号(*
)匹配任何实体,仅当实体不存在时,事务才会继续。以下是可能的例子 -
If-None-Match: "xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: *
If-Range
If-Range
请求标头字段可以与条件GET一起使用,以仅请求缺少的实体部分(如果尚未更改),以及整个实体(如果已更改)。以下是一般语法 -
If-Range : entity-tag | HTTP-date
可以使用实体标签或日期来标识已经接收的部分实体。例如 -
If-Range: Sat, 29 Oct 1994 19:43:31 GMT
这里,如果文档自给定日期以来未被修改,则服务器返回Range
头部给出的字节范围,否则返回所有新文档。
If-Unmodified-Since
If-Unmodified-Since
请求标头字段与方法一起使用以使其成为条件。以下是一般语法 -
If-Unmodified-Since : HTTP-date
如果这个字段中指定的时间以来未请求修改所请求的资源,则服务器应执行所请求的操作,就像If-Unmodified-Since
标头不存在一样。例如 -
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
如果请求通常会导致2xx
或412
状态之外的任何其他内容,则应忽略If-Unmodified-Since
标头。
Max-Forwards
Max-Forwards
请求标头字段提供了一种使用TRACE
和OPTIONS
方法的机制,以限制可以将请求转发到下一个入站服务器的代理或网关的数量。以下是一般语法 -
Max-Forwards : n
Max-Forwards
值是十进制整数,表示可以转发此请求消息的剩余次数。这对于使用TRACE
方法进行调试非常有用,可以避免无限循环。例如 -
Max-Forwards : 5
对于HTTP规范中定义的所有其他方法,可以忽略Max-Forwards
头字段。
Proxy-Authorization
Proxy-Authorization
请求标头字段允许客户端将自己(或其用户)标识到需要认证的代理。以下是一般语法 -
Proxy-Authorization : credentials
Proxy-Authorization
字段值包含包含代理的用户代理的身份验证信息和/或所请求资源的域的凭证。
Range
Range
请求标头字段指定从文档请求的内容的部分范围。以下是一般语法 -
Range: bytes-unit = first-byte-pos "-" [last-byte-pos]
byte-range-spec
中的first-byte-pos
值给出了一个范围内第一个字节的字节偏移量。last-byte-pos
值给出范围中最后一个字节的字节偏移量; 也就是说,指定的字节位置是包含的。可以将字节单位指定为字节字节偏移量从零开始。以下是一个简单的例子 -
- The first 500 bytes
Range: bytes = 0-499
- The second 500 bytes
Range: bytes = 500-999
- The final 500 bytes
Range: bytes = -500
- The first and last bytes only
Range: bytes = 0-0,-1
可以列出多个范围,以逗号分隔。如果缺少以逗号分隔的字节范围中的第一个数字,则假定该范围从文档的末尾开始计数。如果缺少第二个数字,则范围是文档末尾的字节n
。
Referer
Referer
请求标头字段允许客户端指定从中请求URL的资源的地址(URI)。以下是一般语法 -
Referer : absoluteURI | relativeURI
以下是一个简单的例子 -
Referer: http://www.zaixian.org/http/index.html
如果字段值是相对URI,则应相对于Request-URI
进行解释。
TE
TE请求头字段指示它在响应中愿意接受的扩展传输编码以及它是否愿意接受分块传输编码中的尾部字段。以下是一般语法 -
TE: t-codings
关键字trailers
存在表明客户端愿意接受分块传输编码中的trailers
字段,并指定其中一种方式 -
TE: deflate
TE:
TE: trailers, deflate;q = 0.5
如果TE
字段值为空或者如果不存在TE
字段,则仅对传输编码进行分块。没有传输编码的消息总是可以接受的。
User-Agent
User-Agent
请求标头字段包含有关发起请求的用户代理的信息。以下是一般语法 -
User-Agent : product | comment
示例:
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
服务器响应标头
Accept-Ranges
Accept-Ranges
响应头字段允许服务器指示其接受资源的范围请求。以下是一般语法 -
Accept-Ranges : range-unit | none
例如,接受字节范围请求的服务器可以发送 -
Accept-Ranges: bytes
不接受任何资源范围请求的服务器可以发送 -
Accept-Ranges: none
它将建议客户不要尝试范围请求。
Age
Age
响应头字段传达发送方对自原始服务器生成响应(或其重新验证)以来的时间量的估计。以下是一般语法 -
Age : delta-seconds
Age
值是非负十进制整数,表示以秒为单位的时间。以下是一个简单的例子 -
Age: 1030
包含缓存的HTTP/1.1
服务器必须在从其自己的缓存生成的每个响应中包含Age
头字段。
ETag
ETag
响应标头字段提供所请求变体的实体标签的当前值。以下是一般语法 -
ETag : entity-tag
以下是简单的例子 -
ETag: "xyzzy"
ETag: W/"xyzzy"
ETag: ""
Location
Location
响应标头字段用于将收件人重定向到Request-URI
以外的位置以完成。以下是一般语法 -
Location : absoluteURI
以下是一个简单的例子 -
Location: http://www.zaixian.org/http/index.html
Content-Location
头字段与Location
的不同之处在于Content-Location
标识请求中包含的实体的原始位置。
Proxy-Authenticate
Proxy-Authenticate
响应头字段必须作为407(需要代理身份验证)响应的一部分包含在内。以下是一般语法 -
Proxy-Authenticate : challenge
Retry-After
Retry-After
响应头字段可以与503(服务不可用)响应一起使用,以指示服务预期对请求客户端不可用的时间。以下是一般语法 -
Retry-After : HTTP-date | delta-seconds
以下是两个简单的例子 -
Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
Retry-After: 120
在后一个例子中,延迟是2分钟。
Server
Server
响应标头字段包含有关源服务器用于处理请求的软件的信息。以下是一般语法 -
Server : product | comment
以下是一个简单的例子 -
Server: Apache/2.2.14 (Win32)
如果通过代理转发响应,则代理应用程序不得修改Server
响应标头。
Set-Cookie
Set-Cookie
响应头字段包含要为此URL保留的名称/值对信息。以下是一般语法 -
Set-Cookie: NAME = VALUE; OPTIONS
Set-Cookie
响应头包括令牌Set-Cookie:,
后跟逗号分隔的一个或多个cookie
列表。以下是指定为选项的可能值 -
编号 | 选项 | 描述 |
---|---|---|
1 | Comment = comment |
此选项可用于指定与cookie 关联的注释。 |
2 | Domain = domain |
Domain 属性指定cookie 有效的域。 |
3 | Expires = Date-time |
Cookie过期的日期。如果它是空白,则访问者退出浏览器时cookie将过期。 |
4 | Path = path |
Path 属性指定此cookie 适用的URL子集。 |
5 | Secure |
它指示用户代理仅在安全连接下返回cookie。 |
以下是服务器生成的简单cookie
标头的示例 -
Set-Cookie: name1 = value1,name2 = value2; Expires = Wed, 09 Jun 2021 10:18:14 GMT
Vary
Vary
响应头字段指定实体具有多个源,因此可以根据指定的请求头列表而变化。以下是一般语法 -
Vary : field-name
可以指定由逗号分隔的多个标头,并且值为星号*
表示未指定的参数不限于请求标头。以下是一个简单的例子 -
Vary: Accept-Language, Accept-Encoding
WWW-Authenticate
WWW-Authenticate
响应头字段必须包含在401(未授权)响应消息中。字段值包括至少一个challenge
,该challenge
指示适用于Request-URI
的认证方案和参数。以下是一般语法 -
WWW-Authenticate: BASIC realm = "Admin"
3. 实体标头
Allow
Allow
实体标头字段列出Request-URI
标识的资源支持的方法集。以下是一般语法 -
Allow : Method
可以指定以逗号分隔的多个方法。以下是一个简单的例子 -
Allow: GET, HEAD, PUT
此字段无法阻止客户端尝试其他方法。
Content-Encoding
Content-Encoding
实体标头字段用作媒体类型的修饰符。以下是一般语法 -
Content-Encoding : content-coding
内容编码是Request-URI
标识的实体的特征。以下是一个简单的例子 -
Content-Encoding: gzip
如果请求消息中的实体的内容编码对于源服务器是不可接受的,则服务器应该以状态代码415(不支持的媒体类型)进行响应。
Content-Language
Content-Language
实体标头字段描述了所包含实体的目标受众的自然语言。以下是一般语法 -
Content-Language : language-tag
可以针对针对多个受众的内容列出多种语言。以下是一个简单的例子 -
Content-Language: mi, en
内容语言的主要目的是允许用户根据用户自己的首选语言识别和区分实体。
Content-Length
Content-Length
实体标头字段指示实体主体的大小,以十进制数量的OCTET
发送给接收者,或者在HEAD方法的情况下,实体主体的大小已经发送到GET请求。以下是一般语法 -
Content-Length : DIGITS
以下是一个简单的例子 -
Content-Length: 3495
任何大于或等于零的Content-Length
都是有效值。
Content-Location
当该实体可从与所请求资源的URI分开的位置访问时,Content-Location
实体标头字段可用于为消息中包含的实体提供资源位置。以下是一般语法 -
Content-Location: absoluteURI | relativeURI
以下是一个简单的示例 -
Content-Location: http://www.zaixian.org/http/index.html
Content-Location
的值还定义了实体的基URI。
Content-MD5
Content-MD5
实体标头字段可用于提供实体的MD5摘要,用于在接收时检查消息的完整性。以下是一般语法 -
Content-MD5 : md5-digest using base64 of 128 bit MD5 digest as per RFC 1864
以下是一个简单的例子 -
Content-MD5 : 8c2d46911f3f5a326455f0ed7a8ed3b3
MD5摘要是基于实体主体的内容计算的,包括已应用的任何内容编码,但不包括应用于消息主体的任何传输编码。
Content-Range
Content-Range
实体标头字段与部分实体主体一起发送,以指定应在整个实体主体中应用部分主体的位置。以下是一般语法 -
Content-Range : bytes-unit SP first-byte-pos "-" last-byte-pos
假设实体包含总共2233
个字节的byte-content-range-spec
值的示例 -
- The first 500 bytes:
Content-Range : bytes 0-499/2233
- The second 500 bytes:
Content-Range : bytes 500-999/2233
- All except for the first 500 bytes:
Content-Range : bytes 500-1233/2233
- The last 500 bytes:
Content-Range : bytes 734-1233/2233
当HTTP消息包括单个范围的内容时,该内容与Content-Range
标头一起传输,Content-Length
标头显示实际传输的字节数。例如,
HTTP/1.1 206 Partial content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif
Content-Type
Content-Type
实体标头字段指示发送给接收方的实体主体的媒体类型,或者在HEAD
方法的情况下,指示在请求是GET
时已经发送的媒体类型。以下是一般语法 -
Content-Type : media-type
下面是一个简单的示例 -
Content-Type: text/html; charset = ISO-8859-4
Expires
Expires
实体标头字段给出了响应值被视为是过时的日期/时间。以下是一般语法 -
Expires : HTTP-date
下面是一个简单的示例 -
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Last-Modified
Last-Modified
实体标头字段指示源服务器认为变体上次修改的日期和时间。以下是一般语法 -
Last-Modified: HTTP-date
以下是一个简单的示例 -
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT