http协议中的header详细讲解
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
写的简单代理服务器。const 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
则表示客户端将不会接收缓存过的响应。于是,中间的缓存服务器必须把客户端请求转发给源服务器。在上面的简单代理服务器中添加多一个判断:
const 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
优先,不进行缓存。res.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秒res.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
相关文章:

http协议中的header详细讲解
http协议中的header详细讲解 HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。 请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。 HTTP 协议规定,请求从客户端发出…...
探索后量子安全:基于格加密技术的未来密码学展望
在信息技术日新月异的今天,量子计算作为下一代计算技术的代表,正逐步从理论走向实践。量子计算的出现对现有的加密体系构成了严重威胁,尤其是基于大数分解和离散对数难题的传统密码学(如RSA和Diffie-Hellman协议)。为了…...
WPF之UI进阶--完整了解wpf的控件和布局容器及应用
前面三篇有关WPF的基础介绍,分别介绍了wpf与winform的异同,wpf的事件生成和使用以及数据绑定。但我们还缺乏一副好的“皮囊”,所以从这篇开始我们来开始学习wpf的UI相关的内容,首当其冲的就是布局容器。 其实我们知道,…...

unity一键注释日志和反注释日志
开发背景:游戏中日志也是很大的开销,虽然有些日志不打印但是毕竟有字符串的开销,甚至有字符串拼接的开销,有些还有装箱和拆箱的开销,比如Debug.Log(1) 这种 因此需要注释掉,当然还需要提供反注释的功能&am…...

VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

甄选范文“论软件需求管理”,软考高级论文,系统架构设计师论文
论文真题 软件需求管理是一个对系统需求变更了解和控制的过程。需求管理过程与需求开发过程相互关联,初始需求导出的同时就要形成需求管理规划,一旦启动了软件开发过程,需求管理活动就紧密相伴。 需求管理过程中主要包含变更控制、版本控制、需求跟踪和需求状态跟踪等4项活…...

Android Studio Dolphin 中Gradle下载慢的解决方法
我用的版本Android Studio Dolphin | 2021.3.1 Patch 1 1.Gradle自身的版本下载慢 解决办法:修改gradle\wrapper\gradle-wrapper.properties中的distributionUrl 将https\://services.gradle.org/distributions为https\://mirrors.cloud.tencent.com/gradle dis…...

Excel实现省-市-区/县级联
数据准备 准备省份-城市映射数据,如下: 新建sheet页,命名为:省-市数据源,然后准备数据,如下所示: 准备城市-区|县映射数据,如下: 新建sheet页,命名为&#x…...
【优化代码结构】函数的参数归一化
某些封装的函数,其参数具有多样性,会导致函数中会增加非常多的分支,比如下面这个 format 函数有如下几种参数方式,其中 formatter 会有很多种情况 date:日期对象formatter: ‘date’:格式化日期…...
CSS中height设置100vh和100%的区别
文章目录 CSS中height设置100vh和100%的区别一、引言二、高度设置的区别1、100%1.1、父元素高度固定1.2、父元素高度未定义 2、100vh2.1、视口高度2.2、不受父元素限制 三、总结 CSS中height设置100vh和100%的区别 一、引言 在前端开发中,我们经常需要设置元素的高…...

红米k60至尊版工程固件 MTK芯片 资源预览 刷写说明 与nv损坏修复去除电阻图示
红米k60至尊版机型代码为:corot。 搭载了联发科天玑9200+处理器。此固件mtk引导为MT6985。博文将简单说明此固件的一些特点与刷写注意事项。对于NV损坏的机型。展示修改校验电阻的图示。方便改写参数等 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2…...
QEMU使用Qemu-Guest-Agent传输文件、执行指令等
简介 之前介绍过qemu传输文件,使用的挂载 / samba方式 :Qemu和宿主机不使用外网进行文件传输。 这是一种方式,这里还有另一种方式:使用Qemu-Guest-Agent,后面简称qga。 官网介绍:https://www.qemu.org/d…...
【漏洞复现】金和OA C6 GeneralXmlhttpPage.aspx Sql注入漏洞
免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...

复数表示的电场
Exm加是复振幅,这是用复数表示电场,并提取只与空间有关的项复振幅就是复数表示电场,且把与空间xyz有关的量提取出来 经过验证实数E0cos(wtδx)对t求导,等于E0e^j(wtδx)对t求导再取实部 实数表示电磁波cos…...
常用快捷键整理
用加粗标注的是我个人使用时常用的,其实这个全凭个人喜好,大家可以熟悉一下自己喜欢的,都多试试,把觉得有用的记一下,多使用,后续写代码效率就会提高一些) 常用 VS 运行调试程序快捷键 编译 . 编译程序&a…...
【Transformer】长距离依赖
在自然语言处理(NLP)中,长距离依赖(Long-Range Dependencies)指的是在文本中相隔较远的两个或多个元素之间的依赖关系。这些依赖关系可以是语法上的,也可以是语义上的。例如,在句子中࿰…...

Git傻傻分不清楚(下)
进入Idea编译器 File -> New -> Project from Version Control -> URL (这个路径是要拉取项目的Github路径哦~) 设置成maven项目...

golang学习笔记27-反射【重要】
本节也是GO核心部分,很重要。包括基本类型的反射,结构体类型的反射,类别方法Kind(),修改变量的值。 目录 一、概念,基本类型的反射二、结构体类型的反射三、类别方法Kind()四、修改变量的值 一、概念,基本…...

利用Puppeteer-Har记录与分析网页抓取中的性能数据
引言 在现代网页抓取中,性能数据的记录与分析是优化抓取效率和质量的重要环节。本文将介绍如何利用Puppeteer-Har工具记录与分析网页抓取中的性能数据,并通过实例展示如何实现这一过程。 Puppeteer-Har简介 Puppeteer是一个Node.js库,提供…...

YOLOv5改进系列(1)——添加CBAM注意力机制
一、如何理解注意力机制 假设你正在阅读一本书,同时有人在你旁边说话。当你听到某些关键字时,比如“你的名字”或者“你感兴趣的话题”,你会自动把注意力从书上转移到他们的谈话上,尽管你并没有完全忽略书本的内容。这就是注意力机…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...

篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...

Yolo11改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用
1 论文信息 FBRT-YOLO(Faster and Better for Real-Time Aerial Image Detection)是由北京理工大学团队提出的专用于航拍图像实时目标检测的创新框架,发表于AAAI 2025。论文针对航拍场景中小目标检测的核心难题展开研究,重点解决…...