文档类文章,写的不算详细,后续会继续补充图片讲解、丰富文字描述,写这篇文章全程手写,用于加深个人记忆,相关内容已更新到github主页,期待您的star
HTTP协议的请求和响应报文中必定包含HTTP首部,只是平时在使用Web的过程中感受不到它。
目录
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
Cache-Control
通过指定该属性,操作缓存的工作机制
- public
表明其他用户也可利用缓存
- private
只以特定的用户作为对象,对于其他的用户发送过来的请求,代理服务器则不会返回缓存
- no-cache
-
客户端请求头中包含 表示客户端不会接收缓存过的响应,防止从缓存中返回过期的资源,缓存服务器会直接把请求转发给源服务器,进行有效期确认后处理资源
-
服务器响应头中包含
iniCache-Control: no-cache=Location
如果响应头中有参数值则说明不进行缓存,如果没有值则可以进行缓存
- no-store
不进行缓存
- s-maxage
ini
Cache-Control: s-maxage=1000
单位:秒
s-maxage与max-age功能相同,不同点是s-maxage指定只适用于供多位用户使用的公共缓存服务器,对于同一用户重复返回响应的服务器来说,这个指令没有任何作用。
如果使用此指令,则忽略Expires、max-age
首部
extend: s-maxage与max-age的区别 -- max-age用于指定任何缓存(包括中间缓存)可以缓存资源的最长时间。s-maxage指定仅适用于共享缓存,例如代理服务器,用于指定共享缓存可以缓存资源的最长时间。max-age更多的是通过控制客户端缓存可以缓存资源的时间来优化web性能。虽然max-age仍有安全隐患
- max-age
ini
Cache-Control: max-age=1000
单位:秒
如果缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源 即:缓存时间没超过指定值就使用缓存
当值为0时,缓存服务器需要将请求转发给源服务器
HTTP/1.1版本中,max-age优先级高于Expires,HTTP/1.0中相反
- max-stale
ini
Cache-Control: max-stale=1000
单位:秒
指示缓存资源,即使过期也照常接收
如果未指定参数值,那么无论经过多久,客户端都会接收响应
- min-fresh
ini
Cache-Control: min-fresh=1000
单位:秒
要求缓存服务器返回至少还未过指定时间的缓存资源
在这1000秒内如果有超过有效期的资源都无法作为响应返回
- no-transform
无论是在请求还是在响应中,缓存都不能改变实体主体的媒体类型,可防止缓存或代理压缩图片等类似操作
- only-if-cached
要求缓存服务器不重新加载响应,也不会再次确认资源有效性,若发生请求缓存服务器的本地缓存无响应,则返回504
- must-revalidate
代理服务器必须再次向源服务器确认验证资源有效性,如果无法连通源服务器再次获取有效资源的话,则必须给客户端返回一条504状态码
- proxy-revalidate
代理服务器向客户端返回响应之前,必须再次验证缓存资源有效性
Connection
控制不再转发给代理的首部字段,管理持久化连接
- 不再转发给代理的首部字段
makefile
Connection: 不再转发给代理的首部字段
在客户端发送请求和服务器返回响应内都可使用
- 管理持久化连接
HTTP/1.1中默认持久化连接,当服务器端想明确断开连接时,则指定属性值为close,如下
arduino
Connection: close
在HTTP的旧版本中,默认不持久化连接,则需指定属性值为 Keep-Alive,如下
makefile
Connection: Keep-Alive
Date
表明创建HTTP报文的日期和时间
HTTP/1.1使用RFC1123中规定的日期时间的格式
yaml
Date: Tue, 03 Jul 2023 04:18:50 GMT
HTTP之前版本中使用RFC850中定义的格式
javascript
Date: Tue, 03-Jul-2023 04:18:50 GMT
还有一种格式,与C标准库中的asctime()函数的输出格式一致
yaml
Date: Tue, Jul 03 04:18:50 2023
Pragma
历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义
例如不接受过期缓存,直接使用Cache-Control: no-cache
是最佳,但是掌握全部代理服务器的HTTP版本不太现实,所以为了更好的使用,需要同时指定Pragma:no-cache
首部字段
Trailer
事先说明在报文主体后记录了哪些首部字段
makefile
Trailer: Expires
在报文主体后会出现Expires首部
Transfer-Encoding
传输报文主体时采用的编码方式,HTTP/1.1的传输编码方式仅对分块传输编码有效
Upgrade
用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,参数值可用来指定一个完全不同的通信协议
Via
追踪客户端与服务器之间的请求和响应报文的传输路径
报文经过代理或网关时,会先在Via首部字段中附加该服务器的信息,然后再进行转发
vbnet
GET / HTTP/1.1
Via: 1.0 代理服务器1,
1.1 代理服务器2,
xxx
像上面所示,Via经过每个代理服务器会附加上服务器信息,前面的1.x为HTTP版本,后面为服务器信息,如果经过多个将以逗号隔开
Via首部经常与TRACE方法结合使用,用来追踪传输路径
Warning
告知用户一些与缓存相关的问题的警告
格式如下:
Warning: [警告码] [警告的主机:端口号] "警告内容" [日期时间]
日期时间可省略
请求首部字段
客户端往服务端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言 |
Authorization | Web认证信息 |
Except | 期待服务器的特定行为 |
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
通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级
-
媒体类型 文本类型:text/plain,text/html,text/css,application/json,application/xml,application/xhtml+xml...
图片类型:image/jpeg, image/gif, image/png...
音视频类型:video/mp4, video/mpeg, video/quicktime, audio/mp3...
应用程序使用的二进制文件:application/octet-stream, application/zip...
这只是一小部分常见的类型,Accept值可以是任何有效的MIME类型
-
优先级处理 若想要给显示的媒体类型增加优先级,则使用q= 来额外表示权重,用分号隔开,值范围是0-1(可使用小数,精确到小数点后三位),默认为1
Accept: application/xml,text/html;q=0.8,*/*
/ 通配符 -- 表示接受所有类型的响应
Accept: application/xml;q=0.5,text/html;q=0.8
Accept-Charset
用于指定客户端能够接受的字符集编码。它允许客户端向服务器传递一个或多个字符集编码,也可指定优先级与Accept优先级规则一致
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
常见属性:
- UTF-8:Unicode字符集的一种编码方式,支持大部分国际语言字符。
- ISO-8859-1:也被称为Latin-1,是ISO/IEC 8859标准定义的字符集编码,覆盖了西欧语言字符。
- ISO-8859-2:也被称为Latin-2,是ISO/IEC 8859标准定义的字符集编码,覆盖了中欧和东欧语言字符。
- Shift_JIS:日本的字符集编码,常用于日语文本。
- EUC-KR:韩国的字符集编码,常用于韩语文本。
- GB2312:中国的字符集编码,覆盖了简体中文字符。
- Big5:繁体中文的字符集编码。
Accept-Encoding
用于指定客户端能够接受的内容编码方式。它允许客户端向服务器传递一个或多个内容编码方式,也可指定优先级与Accept优先级规则一致
Accept-Encoding: gzip, deflate
Accept-Encoding: *
常见属性值
- gzip:GNU zip压缩算法,常用于文本内容的压缩,可以显著减小传输的数据量。
- deflate:使用zlib库进行压缩的算法,与gzip相似,但在一些情况下效果稍差。
- br:Brotli压缩算法,是一种较新且高效的压缩算法,可以实现更好的压缩比。
- identity:标识不使用任何内容编码,即不进行压缩或编码。
- compress:UNIX系统中常用的压缩算法,已经很少使用。
- 也可以使用 * 作为通配符,指定任意的编码格式
Accept-Language
用于指定客户端所能接受的自然语言,也可指定优先级与Accept优先级规则一致,常见语言标识符
常见属性:
- en:英语(English)。
- zh-CN:简体中文(中国大陆)。
- zh-TW:繁体中文(台湾)。
- ja:日语(Japanese)。
- ko:韩语(Korean)。
- de:德语(German)。
- fr:法语(French)。
- es:西班牙语(Spanish)。
- ru:俄语(Russian)。
- pt:葡萄牙语(Portuguese)。
每个语言标识符通常由一个主要语言和一个可选的地区/国家代码组成
Authorization
用来告知服务器用户代理的认证信息,提供身份验证凭据,允许客户端在访问受保护资源时提供身份验证信息,以验证其身份并获得授权
常见的属性:
- Basic: 基本身份验证(Basic Authentication) 是最常见的身份验证方式。credentials由用户名和密码组成,并经过base64编码的字符串。服务器收到这个凭据后,会解码并验证用户名和密码的有效性
- Bearer: 用于OAuth2.0授权框架中的身份验证机制。token代表访问令牌(Access Token),用于授权访问受保护资源
- Digest: 摘要身份验证(Digest Authentication)是一种安全的身份验证方式。在Authorization字段中,credentials包含一系列摘要信息,包括用户名、密码和其他安全参数。服务器使用这些信息与存储的凭据进行比较来验证身份
- Token: 通用的令牌身份验证机制,其中token可以是任何类型的身份验证令牌,如JWT(JSON Web Token)
- ...
Expect
客户端告知服务器期望出现的某种特定行为,很多属性都已经被废弃,使用前还请查阅相关的规范和文档
常用属性:
- 100-continue: 当客户端发送包含大量数据的请求时,可以使用此属性。客户端在发送请求头部时,附带
Expect: 100-continue
字段,以通知服务器它期望收到一个100 Continue响应。如果服务器接受请求并愿意继续处理,它将发送一个100 Continue响应,然后客户端才会继续发送请求体 - handshake: 在WebSocket握手期间,客户端可以使用此属性来指示服务器进行WebSocket握手。服务器收到此请求后,可以发送适当的响应以完成握手过程,简历WebSocket连接
- trailer: 用于指示客户端期望在响应结束后收到一些附加的响应头部字段。服务器在发送响应正文后,可以发送一个包含附加头部字段的Trailer头部,以满足客户端的期望
- continue: 类似于100-continue,它用于告知服务器客户端期望收到一个100 Continue响应。然而,这个属性在HTTP/1.1中已经被废弃
From
用来告知服务器使用用户代理的用户的电子邮箱地址
通常其使用的目的就是为了显示搜索引擎等用户代理的负责人的电子邮件练习方式
From: jinair1121@163.com
Host
首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号,在HTTP/1.1规范内是唯一一个必须被包含在请求内的首部字段
一般情况下,请求中的主机名会用IP地址直接替换解决
但是如果相同的ip地址下部署运行着多个域名,那么服务器无法理解究竟是哪个域名对应的请求。此时就需要使用首部字段Host来明确指出请求的主机名,若服务器未设定主机名,那直接发送一个空值即可
If-Match
条件请求,用于指定一个或多个实体标签(ETag), 以便在服务器上进行资源更新操作时进行条件检查
客户端可以告知服务器,只有当资源的当前实体标签与请求中指定的实体标签匹配时,才执行请求的操作,如果不匹配,服务器返回412状态码,表示前提条件失败,并且请求不会执行
ETag表示实体标签,资源的唯一标识符,通常是由服务器生成的哈希值或版本号。在服务器响应请求时,通常会将当前资源的实体标签包含在ETag响应首部中。客户端发起更新操作时,将这个实体标签作为条件发送给服务器
- 匹配单个实体标签:
If-Match: "etag1"
- 匹配多个实体标签:
If-Match: "etag1", "etag2", "etag3"
只要匹配到其中一个,请求就会执行 - 匹配任何实体标签:
If-Match: *
无论资源的实体标签是什么,请求都会被执行,即无条件更新
If-Match首部通常与PUT或DELETE请求一起使用,用于确保在执行更新或删除操作之前,服务器上的资源仍然与客户端预期的相符。如果实体标签不匹配,服务器可以根据需要采取适当的操作,例如返回错误或忽略请求。
attention:如果请求中未包含If-Match首部,服务器将忽略条件检查,无论当前资源的实体标签是什么,请求都会被执行。此时,服务器可能会忽略潜在的并发更新问题,因此在关注资源的一致性和并发性时,使用If-Match首部是一个重要的实践。
If-Modified-Since
指定一个日期时间,只有当资源在指定日期时间之后被修改过,才会返回实际内容,否则返回304 Not Modified,表示资源未更改
If-Modified-Since: Mon, 17 Jul 2023 22:04:23 GMT
获取资源的更新日期时间,可通过确认首部字段Last-Modified
来确定
If-None-Match
与If-Match作用相反,用于指定If-None-Match字段值的实体标记(ETag)值与请求资源的ETag不一致时,它就告知服务器处理该请求
在GET或HEAD方法中使用此字段可获取最新的资源,与If-Modified-Since有些类似
匹配规则与If-Match一致(单个、多个、任意)
If-Range
告知服务器若指定的If-Range的字段值(ETag值或时间)和请求资源的ETag值或时间一致时,作为范围请求处理。否则就返回全体资源。通常与Range头部一起使用
sql
If-Range: <ETag> | HTTP-Date
- ETag 字符串,代表与资源关联的实体标签。ETag是一个服务器为资源分配的唯一标识符,用于标记资源的版本。当资源发生变化时,ETag的值会随之改变,从而使客户端能够区分不同版本的资源
- HTTP-Date 遵循RFC7231日期规范,用于表示资源的最后修改时间,以便客户端可以根据资源的修改日期来判断是否需要重新获取资源。
服务器会根据字段值来判断是否满足条件,如果满足条件将返回整个资源,否则,如果资源未修改,则返回部分内容(206状态码);如果资源已修改,则服务器返回整个资源(200)
使用If-Range头部可以在资源未修改的情况下避免重复传输整个资源,提高请求效率,尤其在使用Range头部请求部分资源时。
If-Unmodified-Since
与If-Modified-Since相反,作用是告知服务器指定的请求资源只有在字段值内指定的日期之后未发生更新的情况下,才能处理请求,如果发生了更新则返回412
yaml
If-Unmodified-Since: HTTP-Date
例:Tue, 18 Jul 2023 11:42:11 GMT
Max-Forwards
用于控制请求的转发次数。指示请求在通过代理服务器或网关时可以转发的最大次数。每经过一次代理服务器或网关,该值会减1,直到到0为止。当值为0时,代理服务器或网关应该停止转发请求,并返回响应
makefile
Max-Forwards: number
number: 一个正整数,表示可以转发的最大次数
通常与TRACE方法一起使用。
防止请求在循环代理的网络中无限转发,从而避免请求的无线循环和资源浪费
Proxy-Authorization
用于在代理服务器上进行身份验证。用于在发送请求时提供代理服务器需要的凭据,以便访问目标资源。字段值通常使用Base64编码,将用户名和密码组合成一个字符串
javascript
Proxy-Authorization: <credentials>
-
Basic:最常用,将用户名和密码进行base64编码,并在
Authorization
请求头中包含Basic
关键字,后跟编码的凭据,例如Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
, Basic后面的字符串就是用户名和密码的编码。虽然经过编码,但是不是加密的形式,所以安全性较低,常用但不建议使用 -
Digest:在第一次请求时,客户端发送用户名和密码的摘要,然后在后续请求中使用生成的摘要来验证身份。避免了在请求中发送明文密码,提供了更好的安全性
-
NTLM:在windows系统上常用的身份验证机制。使用一系列挑战和响应来完成身份验证过程
-
Negotiate:指示客户端剋有通过NTLM或Kerberos进行身份验证。服务器将从客户端接收第一条请求,并根据支持的方案来选择相应的身份验证机制
-
Bearer: 用于OAuth2.0身份验证,客户端通过提供token来验证身份
-
AWS4-HMAC-SHA256:AWS(Amazon Web Services)使用的身份验证机制,基于签名版本4的哈希消息认证码(HMAC-SHA256)
-
Custom: 自定义身份验证机制,有些代理服务器或系统可能支持
Range
对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。
ini
语法:Range: bytes=first-byte-pos-last-byte-pos
Range: bytes=5001-10000 // 请求获取从第5001字节至第10000字节的资源
bytes是Range首部的唯一属性值,用于指定请求的资源范围。
接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码206 Partial Content。无法处理范围请求时,则返回状态码200 OK的响应及全部资源
Referer
正确的拼写应该是Referrer,告知服务器请求的原始资源的URI,当浏览器从一个页面跳转到另一个页面或发送请求时,会在头部包含该字段,告知服务器当前请求从哪个页面来的
makefile
Referer: <URL>
Referer: https://www.baidu.com/
作用:
- 统计分析:了解从哪些页面跳转过来的,从而分析流量来源和用户行为
- 防盗链:防止其他网站直接连接到本站
- SEO: 了解用户搜索来源,从而优化搜索结果的相关性
- 安全性检查:确保请求来自合法来源
有时候也会引发隐私和安全问题,因为Referer包含了用户正在访问的页面地址,可能泄露用户的隐私信息。因此在一些敏感或安全性较高的场景下,可能会采取措施限制或禁用Referer头部的发送
TE
告知服务器客户端能够处理响应的传输编码方式及相对优先级,用于传输编码
css
TE: gzip, deflate;q=0.5
除指定传输编码之外,还可以指定伴随trailer字段的分块传输编码的方式。应用后者时,只需把trailers赋值给该字段值
makefile
TE: trailers
User-Agent
将创建请求的浏览器和用户代理名称等信息传达给服务器
由爬虫发起请求时,可能会在子段内添加爬虫作者的电子邮箱地址。此外,如果请求经过代理,那么中间也很可能被添加上代理服务器的名称
响应首部字段
由服务器向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接收字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
Accept-Ranges
用于指示服务器是否支持范围请求以及支持的范围单位。范围请求允许客户端仅请求资源的特定部分而不是整个资源
可指定的值有两种,可处理范围请求时指定其为bytes,反之指定其为none
makefile
Accept-Ranges: none | bytes
none: 表示服务器不支持范围请求,客户端无法请求资源的特定部分,同时也将忽略请求头中的Range头部
bytes:表示服务器支持范围请求,并且范围的单位是字节,响应中还可能包含Content-Range
头部,用于指示返回内容的范围(bytes)
对于大文件或资源的传输,分块下载,断点续传等功能非常有用。
Age
用于指示代理服务器或缓存中缓存的响应的时长,即响应在代理服务器或缓存中存在的时间
arduino
Age: seconds // seconds表示响应在代理服务器或缓存中存在的时间,以秒为单位
Age: 600 // 这个缓存向源服务器确认过,已经过去了10分钟
帮助客户端了解该响应在代理服务器或缓存中存储的时间。
通过判断Age的值来判断数据的新鲜程度,Age值越小说明越新,新获取的。Age值较大,则表示应在代理服务器或缓存中存在的时间较长,可能已经过期或不再是最新的
attention: Age头部只在代理或缓存服务器中使用,并且只对缓存的响应起作用。原始服务器返回的响应不包含该头部
ETag
告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。
服务器会为每份资源分配对应的ETag值,资源更新时,ETag值也需要更新。生成ETag值时,并没有统一的算法规则,而是由服务器来分配
可以用作缓存验证机制,帮助客户端判断资源是否发生了变化,从而优化缓存策略和减少不必要的数据传输
vbnet
ETag: "opaque-string"
opaque-string: 不透明的字符串,用于标识资源的特定版本。这个字符串可以是资源内容的哈希值、版本号或任何能唯一标识资源版本的值
ETag的主要作用是在缓存机制中进行缓存验证。当客户端发送一个请求时,如果先前已经缓存了该资源,客户端会将之前返回的ETag值作为请求头If-None-Match的值,同时指示服务器客户端的缓存版本。服务器接收到请求后,将与当前资源的ETag值进行比较,如果匹配,则说明没有更改,返回304 Not Modified。如果不匹配,则说明发生变化,则返回新的资源内容,并在响应头中更新ETag值
-
强ETag - Strong ETag
完全匹配的标识符,表示资源的特定版本。当资源内容发生任何改变时,强ETag值也会响应地改变
vbnetETag: "adc123"
-
弱ETag - Weak ETag
一个可能不完全匹配的标识符,用于表示资源的特定版本。与强ETag不同,弱ETag的值可能在资源内容发生微小变化时不会改变。通常由服务器生成,并在头部返回,以带有
W/
前缀的引号字符串形式表示vbnetETag: W/"abc123"
弱ETag的主要目的是在资源发生较小变化时提供缓存验证的灵活性。即使资源内容发生了某些变化,但这些变化可能是不重要的或者与缓存副本的差异很小,服务器仍然可以返回304 Not Modified,允许客户端继续使用缓存的版本
强ETag只有在完全匹配时才会返回304状态码,而弱ETag相对宽松,服务器可以根据自己的策略来决定是否返回304状态码
通常情况下,强ETag用于标识严格匹配的资源版本,而弱ETag用于标识部分匹配或灵活匹配的资源版本。
Location
用于指示客户端重定向的目标URL。将重定向的目标URL作为字段值,告知客户需要访问的新位置
基本上,该字段会配合3xx:Redirection的响应,提供重定向的URI
使用场景:
- 网页跳转:当用户访问某个页面时,服务器可能根据不同条件将用户重定向到其他页面,例如登录成功之后跳转到首页
- 资源移动:当资源的URL发生变化时,服务器可以使用Location头部将客户端重定向到新的资源位置
- 错误处理:服务器可能在遇到错误或无效请求时,将客户端重定向到合适的错误页面,帮助用户更好地理解问题
- RESTful API:在RESEful API中,服务器可能返回3xx状态码并在Location头部提供资源的URL,用于指示客户端创建的资源位置
Proxy-Authenticate
用于在代理服务器需要进行用户认证时,向客户端发送认证要求。
当代理服务器要求客户端提供有效的凭据来访问受保护的资源时,会添加此字段并指定认证方案(如基本认证、摘要认证等)
javascript
Proxy-Authenticate: authentication-scheme
authentication-scheme: 表示要认证方式的字符串,如"Basic", "Digest"
客户端会尝试使用指定的认证方案,构造一个带有凭据的请求,并再次发送请求给代理服务器。客户端的认证请求头部通常是 Proxy-Authorization
Retry-After
用于指示客户端在什么时间之后可以重新发送之前的请求。
当服务器无法立即处理请求或返回状态码 503 Service Unavailable(服务不可用)时,可以使用此头部告知客户端何时可以再次尝试请求
bash
Retry-After: date | seconds
date: 特定日期/时间的字符串 seconds:整数,单位为秒
此头部通常用于指示服务的暂时不可用状态
Server
告知客户端当前服务器上安装的HTTP服务器应用程序的信息,包含类型和版本等信息
vbscript
Server: server-name
例:Server: Apache/2.2.17 (Unix)
作用:
- 识别服务器软件
- 版本信息
- 调试和故障排除
attention: 可能存在潜在的安全风险,在生产环境中建议禁止
Vary
用于指示代理服务器和缓存如何根据请求头部中的字段来区分不同的缓存副本。
允许服务器通知代理服务器和缓存,在请求头部的特定字段值不同时,响应实体的内容也可能不同,因此需要分别缓存不同的副本
makefile
Vary: header-field1, header-field2, ...
header-field1, header-field2, ... 表示需要考虑的请求头部字段,这些字段的值会影响响应的内容
主要作用就是用来内容协商。服务器根据客户端的请求头部,选择合适的响应内容来返回。
例如客户端的 Accept-Language
头部,服务器可以返回不同的语言版本的内容。Vary将包含Accept-Language
,以通知代理服务器和缓存,需要根据请求中的语言设置来区分缓存副本
WWW-Authenticate
用于在需要进行用户认证时,向客户端发送认证要求。
当服务器需要客户端提供有效的凭据(用户名和密码)来访问受保护的资源时,会添加此头部,并指定认证方案
状态码401 Unauthorized 响应中,肯定带有此字段
当服务器返回此响应头部时,客户端将在之后的请求中添加 Authorization
头部,并采用返回字段值的认证方式
实体首部字段
实体首部字段包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
Allow
用于指示对特定资源支持的HTTP方法
当服务器接收到不支持的方法时,返回405 Method Not Allowed状态码,同时还会把所有能支持的http方法写入首部字段Allow后返回
vbnet
Allow: method1, method2, ...
Allow: GET, POST, PUT
这些方法可以是标准的 HTTP 方法,如 GET、POST、PUT、DELETE,也可以是自定义的方法。
作用:
- 资源方式限制
- 请求方法检查
Content-Encoding
指示服务器对响应实体进行了哪种类型的内容编码
常见的额内容编码类型:gzip、deflate、br、identity
内容编码是指在不丢失实体信息的前提下所进行的压缩
attention: 通常与Transfer-Encoding一起使用
Content-Language
指示响应实体的自然语言或语言集。
配合头部Accept-Language,进行内容协商
Content-Length
实体主体部分的大小,单位为字节
对实体主体进行内容编码传输时,不能再使用Content-Length。参考RFC2616 4.4
Content-Location
提供了一个指示资源实际位置的URL
用于标识HTTP响应中返回的实体的确切位置,可以与请求URI不同。在重定向或内容复制的情况下特别有用
less
Content-Location: https://www.baidu.com/
Content-MD5
提供响应实体内容的MD5校验,MD5是一种常见的哈希算法,用于生成数据的唯一标识符,也被广泛用于验证数据的完整性
检查报文主体在传输过程中是否保持完整,以及确认传输到达
Content-Range
指定在HTTP请求或响应中传输的部分实体的范围。
它通常与HTTP请求中的Range头部字段或HTTP响应中的Accept-Ranges头部字段一起使用,以支持分段传输或断点续传的功能
xml
Content-Range: <单位> <起始字节位置>-<结束字节位置>/<总字节数>
Content-Range: bytes 5001-10000/10000
attention: 只在响应中使用,不在请求中使用;必须严格遵守规范,以确保正确解析和处理范围信息,如果与请求的范围不匹配,则返回416,表示无法满足请求范围
Content-Type
用于指示HTTP消息中所传输的实体的MIME类型
MIME类型用于标识数据的性质和格式,以便接收方可以正确地处理数据
less
Content-Type: <主类型>/<子类型>
Content-Type: text/html
主类型:数据的主要类别,如文本、图像、音视频等
子类型:数据的具体子类别,进一步细分主类型,如纯文本、HTML、JPEG等
作用:
- 内容解析:根据字段值确定如何解析和处理接收到的数据
- 数据格式指示:帮助接收方准确识别数据的格式,确保正确的数据解析和处理,避免出现数据损坏或意外结果
- 协商内容:在一些情况下,用于内容协商
Expires
指定资源的过期时间。将资源失效的日期告知客户端
客户端在该时间之后,客户端不应再使用缓存的响应,而应向服务器发起新的请求以获取最新的资源
vbnet
Expires: <date>
Expires: Tue 18, Jul 2023 20:33:57 GMT
作用:
- 服务器响应中使用Expires告知客户端,在过期时间之前,可以直接从本地缓存中获取资源,而不必再向服务器发送请求。
- Expires字段允许服务器控制响应的有效时间。
HTTP/1.1中,此字段逐渐被取代,例如Cache-Control,提供了更灵活、更精确的缓存控制能力,能够更好地控制缓存的行为
attention: 由于Expires使用的是GMT格式时间,可能导致客户端和服务器时钟不一致,进而导致时间不准确的问题,所以建议使用Cache-Control来替代Expires
当指定了Cache-Control:max-age时,比起首部字段Expires,会优先处理max-age
Last-Modified
服务器上资源的最后修改时间,它表示资源的最后一次修改发生的日期和时间
sql
Last-Modified: <date>
Last-Modified: Tue 18, Jul 2023 20:43:57 GMT
作用:
- 服务器会将资源的最后修改时间作为Last-Modified字段包含在响应中。客户端会将字段值保存起来,下次请求时将该值作为If-Modified-Since的值,向服务器发送请求
- 该字段可以与ETag字段一起使用进行缓存协商,进行更精细的缓存控制和验证
HTTP/1.1中,提供了更先进的缓存机制Cache-Control和ETag