http协议中的header详细讲解
HTTP
协议和 TCP/IP
协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。
请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。
HTTP
协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。
无状态
HTTP
是一种不保存状态,即无状态(stateless
)协议。HTTP
协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP
这个级别,协议对于发送过的请求或响应都不做持久化处理。
HTTP/1.1
虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了 Cookie
技术。
持久化
HTTP
协议的初始版本中,每进行一次 HTTP
通信就要断开一次 TCP
连接。可随着 HTTP
的普及,文档中包含大量图片的情况多了起来。每次无状态的请求都会造成无谓的 TCP
连接建立和断开,增加通信量的开销。
为解决上述 TCP
连接的问题,HTTP/1.1
和一部分的 HTTP/1.0
想出了持久连接(也称为 HTTP keep-alive
)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP
连接状态。
管线化
持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
http报文
用于 HTTP
协议交互的信息被称为 HTTP
报文。请求端(客户端)的 HTTP
报文叫做请求报文,响应端(服务器端)的叫做响应报文。 HTTP
报文本身是由多行(用 CR+LF
作换行符)数据构成的字符串文本。
HTTP
报文大致可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF
)来划分。通常,并不一定要有报文主体。
请求报文
一个HTTP请求报文由请求行(request line
)、请求头部(header
)、空行和请求数据4个部分组成。
- 请求行:
请求行由请求方法字段、URL
字段和HTTP
协议版本字段3个字段组成。 - 请求首部:
请求首部由关键字/值对组成,每行一对,关键字和值用英文冒号":"分隔。请求头部通知服务器有关于客户端请求的信息。 - 空行:
- 请求数据:
含了所有类型的数据。请求主体中包括了要发送给Web
服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。
响应报文
HTTP
响应也由4个部分组成,分别是:状态行、响应头部、空行、响应正文(实体)。
- 响应行:
响应行由HTTP
版本号,状态码和状态值组成。 - 响应首部:
响应首部也是由关键字/值对组成,每行一对,关键字和值用英文冒号":"分隔。 - 空行:
- 响应正文:
包含了Web
客户端请求的对象。
http首部
HTTP
请求首部字段是由首部字段名和字段值构成的,中间用冒号:
分隔。
HTTP
首部字段根据实际用途被分为以下 4 种类型。
- 通用首部字段(
General Header Fields
)
请求报文和响应报文两方都会使用的首部。 - 请求首部字段(
Request Header Fields
)
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。 - 响应首部字段(
Response Header Fields
)
从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。 - 实体首部字段(
Entity Header Fields
)
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
通用首部
字段 | 描述 | 备注 |
---|---|---|
Connection | 允许客户端和服务器指定与请求/响应连接有关的选项 | -- |
Date | 提供了日期的时间标志,说明报文是什么时间创建的 | -- |
Trailer | 如果报文采用了分块传输编码方式,就可以用这个首部列出位于报文拖挂部分的首部集合 | -- |
Transfer-Encoding | 告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式 | -- |
Update | 给出了发送端可能想要"升级"使用的新版本或协议 | -- |
Via | 显示了报文经过的中间节点(代理、网关) | -- |
Warning | 错误通知 | -- |
Cache-Control | 用于随报文传送缓存指示 | 用于缓存 |
Pragma | 报文指令 | 用于缓存 |
图中的橙色部分就是tcp
连接耗时,可以看到并非全部请求都有进行tcp
的握手连接。设置了keep-alive
后tcp
连接并未断开,图中不同颜色的线标记了复用的tcp
的id
。
设置close
后
可以发现所有的请求都带有橙色部分,就是每个请求都重新建立了tcp
连接。
需要注意的在浏览器上不能设置
Connection:close
,会出现Refused to set unsafe header "Connection"
错误,是因为XMLHttpRequest
不允许设置这些标题,它们是由浏览器自动设置的。原因在于,通过操纵这些标头,可能会欺骗服务器通过相同的连接接受第二个请求,而这种连接不会经过通常的安全检查 - 这将成为浏览器中的安全漏洞。
在客户端发送请求和服务器返回响应内,使用 Connection
首部字段,可控制不再转发给代理的首部字段(即 Hop-by-hop
首部)。
逐跳首部(Hop-by-hop Header
)分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1
和之后版本中,如果要使用 hop-by-hop
首部,需提供 Connection
首部字段。
下面列举了 HTTP/1.1
中的逐跳首部字段。除这 8 个首部字段之外, 其他所有字段都属于端到端首部。 Connection
, Keep-Alive
, Proxy-Authenticate
, Proxy-Authorization
, Trailer
, TETransfer-Encoding
, Upgrade
Date
首部字段 Date
表明创建 HTTP
报文的日期和时间。时间的描述格式由RFC822
定义。例如,Date:Sun, 27 Mar 2022 13:36:28 GMT
。Date
描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
同样,浏览器上不能设置
Date
,会出现Refused to set unsafe header "Date"
错误。
Trailer
Trailer
会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1
版本分块传输编码时。
Transfer-Encoding
Transfer-Encoding
规定了传输报文主体时采用的编码方式。
Upgrade
Upgrade
用于检测 HTTP
协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via
Via
是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
Cache-Control
通过指定首部字段 Cache-Control
的指令,就能操作缓存的工作机制。
指令的参数是可选的,多个指令之间通过","分隔。首部字段 Cache-Control
的指令可用于请求及响应时。
如果要使用这个字段,需要在服务端配置
'Access-Control-Allow-Headers':'Cache-Control'
这个头。
例如:
Cache-Control: private, max-age=0, no-cache
缓存指令
缓存请求指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age= [ 秒] | 必需 | 响应的最大Age值 |
max-stale( = [ 秒]) | 可省略 | 接收已过期的响应 |
min-fresh= [ 秒] | 必需 | 期望在指定时间内的响应仍有效 |
no-transform | 无 | 代理不可更改媒体类型 |
only-if-cached | 无 | 从缓存获取资源 |
cache-extension | 无 | 新指令标记(token) |
缓存响应指令
指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存前必须先确认其有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但必须再向源服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再 进行确认 |
max-age= [ 秒] | 必需 | 响应的最大Age值 |
s-maxage= [ 秒] | 必需 | 公共缓存服务器响应的最大Age值 |
cache-extension | - | 新指令标记(token) |
各指令详解
-
public
:
Cache-Control: public
,明确表明其他用户也可利用缓存。默认为
public
,表明其他代理服务器、客户端可以缓存该响应。当客户端发送了请求时,代理服务器对响应进行缓存,当其他客户端发送相同请求时,代理服务器直接返回缓存就可以,不需要再次访问源服务器。
以下是使用
node
写的简单代理服务器。jsconst cache = {}; const proxyServer = http.createServer((req, res) => { if(cache[req.url]) { res.end(cache[req.url]) } else { const proxy = http.get("http://localhost:3000", (response) => { response.on('data', data => { let cacheControl = response.headers['cache-control'].split(','); if(cacheControl.indexOf('public') > -1) { cache[req.url] = data; } res.end(data); }).on('error', err => { res.end(err); }) }) proxy.end(); } })
-
private
:
Cache-Control: private
,响应只以特定的用户作为对象。只会缓存特定用户的请求,比如说是根据
Authorization
来区别不同的用户。
-
no-cache
:
Cache-Control: no-cache
,该指令的目的是为了防止从缓存中返回过期的资源。当客户端发送的请求中包含了
no-cache
则表示客户端将不会接收缓存过的响应。于是,中间的缓存服务器必须把客户端请求转发给源服务器。在上面的简单代理服务器中添加多一个判断:
jsconst reqCacheControl = req.headers['cache-control']?.split(','); if(cache[req.url] && (reqCacheControl ? reqCacheControl.indexOf('no-cache') === -1 : true)) { res.end(cache[req.url]) } else { //... }
如果服务器返回的响应中包含
no-cache
指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。在响应头的
no-cache
可以指定参数值。那么客户端在接收到这个被指定参数值的首 部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首 部字段可以使用缓存。只能在响应指令中指定该参数。 -
no-store
:
Cache-Control: no-store
,暗示请求(和对应的响应)或响应中包含机密信息。从字面意思上很容易把
no-cache
误解成为不缓存,但事实上no-cache
代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,也许称为do-not-serve-from-cache-without-revalidation
更合适。no-store
才是真正地不进行缓存。 -
max-age
:
Cache-Control: max-age=604800(单位:秒)
,当客户端发送的请求中包含max-age
指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。 另外,当指定max-age
值为0
,那么缓存服务器通常需要将请求转发给源服务器。当服务器返回的响应中包含
max-age
指令时,缓存服务器将不对资源的有效性再作确认,而max-age
数值代表资源保存为缓存的最长时间。应用
HTTP/1.1
版本的缓存服务器遇到同时存在Expires
首部字段的情况时,会优先处理max-age
指令,而忽略掉Expires
首部字段。而HTTP/1.0
版本的缓存服务器的情况却相反,max-age
指令会被忽略。
只有get
请求才会被缓存这个在请求跟响应头都可以设置,但这代表了不同意思。
在请求头中设置
max-age
,在浏览器上前进后退路由,在有效时间内不会重新发送请求(强制刷新则会发送请求)。而在响应头中设置,在有效时间内浏览器并不会重新发送该请求。 -
s-maxage
:
Cache-Control: s-maxage=604800(单位 :秒)
,s-maxage
指令的功能和max-age
指令的相同,它们的不同点是s-maxage
指令只适用于供多位用户使用的公共缓存服务器。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。当使用
s-maxage
指令后,则直接忽略对Expires
首部字段及max-age
指令的处理。 -
min-fresh
:
Cache-Control: min-fresh=60(单位:秒)
,要求缓存服务器返回至少还未过指定时间的缓存资源。比如,当指定min-fresh
为60
秒后,过了60
秒的资源都无法作为响应返回。 -
max-stale
:
Cache-Control: max-stale=3600(单位:秒)
,指示缓存资源,即使过期也照常接收。如果指令未指定参数值,那么无论经过多久,客户端都会接收响应; 如果指令中指定了具体数值,那么即使过期,只要仍处于max-stale
指定的时间内,仍旧会被客户端接收。 -
only-if-cached
:
Cache-Control: only-if-cached
,表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout
。 -
must-revalidate
:
Cache-Control: must-revalidate
,使用must-revalidate
指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条 504(Gateway Timeout
)状态码。使用
must-revalidate
指令会忽略请求的max-stale
指令(即使已经在首部使用了max-stale
,也不会再有效果)。 -
proxy-revalidate
:
Cache-Control: proxy-revalidate
, 要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。 -
no-transform
:
Cache-Control: no-transform
,使用no-transform
指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。 这样做可防止缓存或代理压缩图片等类似操作。
Pragma
Pragma: no-cache
,Pragma
是 HTTP/1.1
之前版本的历史遗留字段,仅作为与 HTTP/1.0
的向后兼容而定义。
所有的中间服务器如果都能以 HTTP/1.1
为基准,那直接采用 Cache-Control: no-cache
指定缓存的处理方式是最为理想的。但要整体掌握全部中间服务器使用的 HTTP
协议版本却是不现实的。因此,发送的请求会同时含有下面两个首部字段。
Cache-Control: no-cache
Pragma: no-cache
pragma
值有no-cache
和no-store
两个选项。
当
pragma
、cache-control
和expires
同时出现时优先级顺序:pragma
->cache-control
->expires
例:
- 同时设置了三个,
pragma
优先,不进行缓存。
jsres.setHeader('Cache-Control', 'max-age=30'); res.setHeader('pragma', 'no-cache'); res.setHeader('expires', new Date(new Date().getTime() + 2000).toGMTString())
- 同时设置了
cache-control
和expires
,cache-control
优先,会被缓存30秒
jsres.setHeader('Cache-Control', 'max-age=30'); res.setHeader('expires', new Date(new Date().getTime() + 2000).toGMTString())
请求首部
字段 | 描述 |
---|---|
Client-IP | 提供了运行客户端的机器的IP地址 |
From | 提供了客户端用户的E-mail地址 |
Host | 给出了接收请求的服务器的主机名和端口号 |
Referer | 提供了包含当前请求URL的文档的URL |
UA-Color | 提供了与客户端显示器的显示颜色有关的信息 |
UA-CPU | 给出了客户端CPU的类型或制造商 |
UA-Disp | 提供了与客户端显示器(屏幕)能力有关的信息 |
UA-OS | 给出了运行在客户端机器上的操作系统名称及版本 |
UA-Pixels | 提供了客户端显示器的像素信息 |
User-Agent | 将发起请求的应用程序名称告知服务器 |
Accept | 告诉服务器能够发送那些媒体类型 |
Accept-Charset | 告诉服务器能够给发送那些字符集 |
Accept-Encoding | 告诉服务器能够发送那些编码方式 |
Accept-Language | 告诉服务器能够发送那些语言 |
TE | 告诉服务器可以使用那些扩展传输编码 |
Expect | 允许客户端列出某请求所要求的服务器行为 |
If-Match | 如果实体标记与文档当前的实体标记相匹配,就获取这份文档 |
If-Modified-Since | 除非在某个指定的日期之后资源被修改过,否则就限制这个请求 |
If-None-Match | 如果提供的实体标记与当前文档的标记不相符,就获取文档 |
If-Range | 允许对文档的某个范围进行条件请求 |
If-Unmodified-Since | 除非在某个指定日期之后资源没有被修改过,否则就限制这个请求 |
Range | 如果服务器支持范围请求,就请求资源的指定范围 |
Authorization | 包含了客户端提供给服务器,以便对其自身进行认证的数据 |
Cookie | 客户端用它向服务器传送一个令牌------------它并不是真正的安全首部,但确实隐含了安全功能 |
Cookie2 | 用来说明请求端支持的cookie版本 |
Max-Forward | 在通往源端服务器的路径上,将请求转发给其他代理或网关的最大次数------------与TRACE方法一同使用 |
Proxy-Authorization | 与Authorization首部相同,但这个首部是在与代理进行认证时使用的 |
Proxy-Connection | 与Connection首部相同,但这个首部是在与代理建立连接时使用的 |
Accept
Accept
首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。服务器通过设置响应头的Content-Type
字段来保持跟客户端Accept
字段一致。
常见格式类型
text/html
: HTML格式text/plain
:纯文本格式text/xml
: XML格式image/gif
:gif图片格式image/jpeg
:jpg图片格式image/png
:png图片格式video/mpeg
:视频vedio/quicktime
:视频application/xhtml+xml
:XHTML格式application/xml
: XML数据格式application/atom+xml
:Atom XML聚合格式application/json
: JSON数据格式application/pdf
:pdf格式application/msword
: Word文档格式application/octet-stream
: 二进制流数据(如常见的文件下载)application/x-www-form-urlencoded
: < form encType="">中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
若想要给显示的媒体类型增加优先级,则使用
q=
来额外表示权重值 1,用分号(;)进行分隔。权重值q
的范围是 0~1(可精确到小数点 后 3 位),且 1 为最大值。不指定权重q
值时,默认权重为q=1.0
。
Accept-Charset
Accept-Charset
首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,可一次性指定多种字符集。与首部字段 Accept
相同的是可用权重 q
值来表示相对优先级。
常见的有字符集有
UTF-8
:Unicode
字符编码ISO-8859-1
: 拉丁字母表的字符编码
Accept-Encoding
Accept-Encoding
首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。
采用权重 q
值来表示相对优先级,这点与首部字段 Accept
相同。另外,也可使用星号(*
)作为通配符,指定任意的编码格式。
常见内容编码:
gzip
: 由文件压缩程序 gzip(GNU zip)生成的编码格式 (RFC1952),采用 Lempel-Ziv 算法(LZ77)及 32 位循环冗余 校验(Cyclic Redundancy Check,通称 CRC)compress
: 由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel- Ziv-Welch 算法(LZW)。deflate
: 组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法 (RFC1951)生成的编码格式。identity
: 不执行压缩或不会变化的默认编码格式。
浏览器中不允许设置该字段。
Accept-Language
首部字段 Accept-Language
用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。
和 Accept
首部字段一样,按权重值 q
来表示相对优先级。
Authorization
首部字段 Authorization
是用来告知服务器,用户代理的认证信息(证书值)。
Expect
主要用于在发送请求时,客户端可以向服务器表明它期待的某种行为。最常见的用途是配合100-continue
机制。
100-Continue机制:
- 当客户端发送一个大请求体(比如文件上传)时,可以在请求头中包含
Expect: 100-continue
。 - 这告诉服务器在处理请求体之前,先检查请求的其他部分(如请求头)。如果服务器准备好接收请求体,它会返回一个
100 Continue
状态码,客户端再开始发送请求体。 - 如果服务器不接受请求,可能会返回一个错误状态码(如
417 Expectation Failed
),这样可以避免发送冗长的请求体,从而节省带宽。
From
首部字段 From
用来告知服务器使用用户代理的用户的电子邮件地址。
通常,其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。使用代理时,应尽可能包含 From
首部字段(但可能会因代理不同,将电子邮件地址记录在 User-Agent
首部字段内)。
Host
Host
会告知服务器,请求的资源所处的互联网主机名和端口号。Host
首部字段在 HTTP/1.1
规范内是唯一一个必须被包含在请求内的首部字段。
请求被发送至服务器时,请求中的主机名会用 IP
地址直接替换解决。但如果这时,相同的 IP
地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。因此,就需要使用首部字段 Host
来明确指出请求的主机名。
If-Match
形如 If-xxx
这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
只有当
If-Match
的字段值跟ETag
值匹配一致时,服务器才会接受请求,这两个字段通常用于协商缓存。
If-Modified-Since
如果在 If-Modified-Since
字段指定的日期时间后,资源发生了更新,服务器会接受请求。
If-Modified-Since
用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段 Last-Modified
来确定。
If-None-Match
只有在 If-None-Match
的字段值与 ETag
值不一致时,可处理该请求。与 If-Match
首部字段的作用相反
If-Range
首部字段 If-Range
属于附带条件之一。它告知服务器若指定的 If-Range
字段值(ETag
值或者时间)和请求资源的 ETag
值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。
If-Unmodified-Since
首部字段 If-Unmodified-Since
和首部字段 If-Modified-Since
的作用相 反。它的作用的是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。如果在指定日期时间后发生了更新,则以状态码 412 Precondition Failed 作为响应返回。
Max-Forwards
通过 TRACE
方法或 OPTIONS
方法,发送包含首部字段 Max-Forwards
的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,Max-Forwards
的 值减 1 后重新赋值。当服务器接收到 Max-Forwards
值为 0 的请求时,则不再进行转发,而是直接返回响应。
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段 Proxy-Authorization
的请求,以告知服务器认证所需要的信息。
这个行为是与客户端和服务器之间的 HTTP
访问认证相类似的,不同之处在于,认证行为发生在客户端与代理之间。客户端与服务器之间的认证,使用首部字段 Authorization
可起到相同作用。
Range
对于只需获取部分资源的范围请求,包含首部字段 Range
即可告知服务器资源的指定范围。
接收到附带 Range
首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。
Referer
字段 Referer
会告知服务器请求的原始资源的 URI
。
TE
首部字段 TE
会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding
的功能很相像,但是用于传输编码。
首部字段 TE
除指定传输编码之外,还可以指定伴随 trailer
字段的分块传输编码的方式。
User-Agent
首部字段 User-Agent
会将创建请求的浏览器和用户代理名称等信息传达给服务器。
响应首部
字段 | 描述 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
Accept-Ranges
用于指示服务器是否支持范围请求。它允许客户端请求部分资源,而不是整个文件,常见于大文件下载或视频流。
当服务器在响应中包含Accept-Ranges: bytes
时,表示它支持字节范围请求。客户端可以通过Range
请求头指定所需的部分。
Age
首部字段 Age
能告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
若创建该响应的服务器是缓存服务器,Age
值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段 Age
。
ETag
首部字段 ETag
能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag
值。
当资源更新时,ETag
值也需要更新。生成 ETag
值时,并没有 统一的算法规则,而仅仅是由服务器来分配。
Location
使用首部字段 Location
可以将响应接收方引导至某个与请求 URI
位置不同的资源。
基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的 URI
。
几乎所有的浏览器在接收到包含首部字段 Location
的响应后,都会强制性地尝试对已提示的重定向资源的访问。
Proxy-Authenticate
首部字段 Proxy-Authenticate
会把由代理服务器所要求的认证信息发送给客户端。
它与客户端和服务器之间的 HTTP
访问认证的行为相似,不同之处在于其认证行为是在客户端与代理之间进行的。
Retry-After
首部字段 Retry-After
告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用。
字段值可以指定为具体的日期时间(Wed, 04 Jul 2012 06:34:24 GMT 等格式),也可以是创建响应后的秒数。
Server
首部字段 Server
告知客户端当前服务器上安装的 HTTP
服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包括版本号和安装时启用的可选项。
Vary
当代理服务器接收到带有 Vary
首部字段指定获取资源的请求时,如果使用的 Accept-Language
字段的值相同,那么就直接从缓存返回响应。反之,则需要先从源服务器端获取资源后才能作为响应返回。
WWW-Authenticate
首部字段 WWW-Authenticate
用于 HTTP
访问认证。它会告知客户端适用于访问请求 URI
所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)。状态码 401 Unauthorized 响应中,肯定带有首部字段 WWW-Authenticate
。
实体首部
字段 | 描述 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
Allow
首部字段 Allow
用于通知客户端能够支持 Request-URI
指定资源的所有 HTTP
方法。
当服务器接收到不支持的 HTTP
方法时,会以状态码 405 Method Not Allowed
作为响应返回。与此同时,还会把所有能支持的 HTTP
方法写入首部字段 Allow
后返回。
Content-Encoding
首部字段 Content-Encoding
会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
Content-Language
首部字段 Content-Language
会告知客户端,实体主体使用的自然语言 (指中文或英文等语言)。
Content-Length
首部字段 Content-Length
表明了实体主体部分的大小(单位是字节)。
Content-Location
首部字段 Content-Location
给出与报文主体部分相对应的 URI
。和首部字段 Location
不同,Content-Location
表示的是报文主体返回资源对应的 URI
。
Content-MD5
首部字段 Content-MD5
是一串由 MD5
算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
对报文主体执行
MD5
算法获得的 128 位二进制数,再通过Base64
编码后将结果写入Content-MD5
字段值。由于HTTP
首部无法记录二进制值,所以要通过Base64
编码处理。为确保报文的有效性,作为接收方的客户端会对报文主体再执行一次相同的MD5
算法。计算出的值与字段值作比较后,即可判断出报文主体的准确性。
Content-Range
针对范围请求,返回响应时使用的首部字段 Content-Range
,能告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。
Content-Type
首部字段 Content-Type
说明了实体主体内对象的媒体类型。和首部字段 Accept
一样,字段值用 type/subtype
形式赋值。
Expires
首部字段 Expires
会将资源失效的日期告知客户端。缓存服务器在接收到含有首部字段 Expires
的响应后,会以缓存来应答请求,在 Expires
字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
Last-Modified
首部字段 Last-Modified
指明资源最终修改的时间。
请求中无效的header设置
w3c规定,当请求的header匹配以下不安全字符时,将被终止
- Accept-Charset
- Accept-Encoding
- Connection
- Content-Length
- Cookie
- Cookie2
- Content-Transfer-Encoding
- Date
- Expect
- Host
- Keep-Alive
- Referer
- TE
- Trailer
- Transfer-Encoding
- Upgrade
- User-Agent
- Via