一、概念
HTTP 是超文本传输协议(HyperText Transfer Protocol),HTTP 请求头与响应头是指客户端与服务端在传输过程中对所传输资源的参数描述。
二、报文头说明
HTTP 请求头说明(客户端提供的资源描述信息)
1. Accept
概念:浏览器可接受的哪种 MIME(Multipurpose Internet Mail Extensions) 类型的信息。
枚举值:
*/*;q=0.01: * 是通配符,*/* 就表示任意MIME类型; “;q=” 表示优先顺序,q 表示权重系数,也就是优先级,值在0-1之间,值越大,优先级越高。如果没有指定 q,则默认为1。
text/plain:普通的 ASCII 文本文档。
text/html:HTML 格式的文本文档。
image/jpeg:JPEG格式的图片。
image/gif:GIF格式的图片。
video/quicktime:Apple 的 QuickTime 电影。
application/vnd.ms-powerpoint:微软的powerpoint文件。
2. Accept-Charset
概念:浏览器可接受的哪种字符集。
枚举值:最常见的 uft-8,iso-8859-15
3. Cookie
概念:浏览器的缓存,一系列的键值对,用;隔开。
枚举值:BAIDUID=82C45A7BBD82D68497DC190EEBF143C3:FG=1;BIDUPSID=82C45A7BBD82D68497DC190EEBF143C3;
4. Host
概念:初始URL的主机和端口,如果没有端口,会默认添加80端口。
枚举值:www.baidu.com
5. Origin
概念:表示发起跨域资源共享的请求或者 POST 请求的请求来源,仅表示服务器名称,并不包含任何路径信息,由协议、域名和端口组成,端口可省略,与 Referer 类似;
枚举值:https://www.baidu.com
6. Referer
概念:当前请求页面的来源页面地址,即当前页面是从那个页面链接过来的。该地址是个绝对路径或者相对路径。
枚举值:https://www.baidu.com/index
7. User-Agent
概念:当前浏览器类型。
枚举值:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36。
8. X-Requested-With
概念:客户端发送的是哪种请求。
枚举值:通常是 XMLHttpRequest。
9. Authorization
概念:服务器用于验证用户代理身份的凭证。
枚举值:Basic YWxhZGRpbjpvcGVuc2VzYW1l(前面 Basic 是验证类型,是基本验证,如果是基本验证,首先用冒号将用户名和密码连接,然后用base64进行编码)。
10. From
概念:请求发送者的 Email地址。
枚举值:webmaster@example.org
11. If-Modified-Since
概念:该文件在服务端最后的修改日期(如果在给定的日期之后进行过修改),只可以用在 GET 和 HEAD 请求中。
枚举值:
Wed, 15 May 2019 06:37:39 GMT(GMT时间)。
Not Modified: 当前请求内容在指定日期之内,则返回不带消息主体的304状态码。
12. If-Unmodified-Since
概念:该文件未修改的最后时间,一般应用于断点续传,没有被修改,则继续传输,传输成功后返回200状态码,如果被修改了,则停止传输,返回412状态码 Precondition failed (预处理错误)。
枚举值:Wed, 15 May 2019 06:37:39 GMT(GMT时间)。
13. If-Match
概念:服务端上次返回的 ETag 值,本次请求时,校验 ETag 值(强比较算法),只有在每个比特都相同的情况下,才认为两个文件相同,否则返回 412 状态码。
枚举值:"bfc13a64729c4290ef5b2c2730249c88ca92d82d"。
14. If-None-Match
概念:服务端上次返回的 ETag 值,本次请求时,校验 ETag 值(弱比较算法),除了每个比特都相同外,内容一致也可以认为是相同。如果不一致,返回 412 状态码。
枚举值:"201827-95d-52c1694befb00"。
15. Pragma
概念:是否启用缓存,同 Cache-Control,是 HTTP/1.0中规定的字段,建议只有在兼容 HTTP/1.0 客户端的情况下应用。
枚举值:no-cache。
HTTP 响应头说明(服务端提供的资源描述信息)
1. Accept-Ranges
概念:自身支持的范围请求,用于定义范围请求的单位。
枚举值:bytes、none。
2. Content-Range
概念:数据片段在整个文件中的位置。
枚举值:bytes 200-1000/67589。
3. Content-Length
概念:文档内容长度,消息主体的大小。
枚举值:12000000。
4. Content-Type
概念:文档类型。
枚举值:text/html; charset=utf-8、multipart/form-data; boundary=something;application/octet-stream(八字节流)。
5. Date
概念:报文创建的日期和时间(GMT时间,格林威治时间+8小时=北京时间)。
枚举值:Mon, 25 Apr 2016 02:09:43 GMT。
6. Expires
概念:表示文档过期时间,也就是缓存有效时间。
枚举值:Mon, 25 Apr 2016 02:09:43 GMT。
7. Last-Modified
概念:文档最后修改时间。
枚举值:Mon, 25 Apr 2016 02:09:43 GMT。
8. Server
概念:源头服务器所用到的软件相关信息。
枚举值:nginx/1.4.4、Apache/2.4.1 (Unix)。
9. ETag
概念:某个资源的某个特定版本的一个标识符,通常是一个消息散列(类似于文件的md5),客户端下次请求时通过 If-None-Match或If-Match带上该值,服务器对该值进行比较,如果一致,则不返回;
枚举值:"lkl1zHu_x9M1bGJ4AGHx6GyqGA_w"。
10. Vary
概念:对于未来的请求头,使用已缓存的响应还是向源服务器请求新的回复。
枚举值:User-Agent、*(所有的请求都被视为唯一并且非缓存的)。
11. X-Content-Type-Options
概念:禁用浏览器内容嗅探行为,相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。
枚举值:nosniff。
12. X-DNS-Prefetch-Control
概念:告诉浏览器当前页面是否要做DNS预解析。
枚举值:on、off。
13. X-Frame-Options
概念:是否允许通过frame加载的页面(sameorigin对同源加载,对不同源不加载)。
枚举值:
DENY:该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN:该页面可以在相同域名页面的 frame 中展示。
ALLOW FROM uri:该页面可以在指定来源的 frame 中展示。
14. X-XSS-Protection
概念:防止XSS(跨站脚本)攻击。
枚举值:
0:禁止 XSS 过滤
1:启用 XSS 过滤(默认设置)
1;mode=block:启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
1; report=<reporting-URI> (Chromium only):启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。
15. Access-Control-Allow-Credentials
概念:是否可以将对请求的响应暴露给页面。
枚举值:true(可以)、false(如果不需要,可以忽略这个头,所以可以不用设置成 false)。
16. Access-Control-Allow-Headers
概念:预检请求中,将会在正式请求中设置的 Access-Control-Expose-Headers 信息。
枚举值:Accept、Accept-Language、Content-Language、Content-Type等。
17. Access-Control-Allow-Methods
概念:预检请求中,允许使用的请求方式。
枚举值:POST、GET、OPTIONS。
18. Access-Control-Allow-Origin
概念:该请求的资源共享给指定的源。
枚举值:https://www.baidu.com、*(任何域都可以访问)。
19. Access-Control-Expose-Headers
概念:那些字段可以作为响应的一部分暴露给外部。
枚举值:X-Log、 X-Reqid、Content-Length、X-Kuma-Revision等(可以同时指定多个,用,隔开)。
20. Access-Control-Max-Age
概念:预检请求的结果缓存时间。
枚举值:600、86400、-1(禁止缓存)。
21. Access-Control-Request-Headers
概念:预检请求时,通知服务器,在真正的请求中会采用的请求字段。
枚举值:X-PINGOTHER、Content-Type。
22. Access-Control-Request-Method
概念:预检请求时,通知服务器,在真正的请求中会采用的请求方式。
枚举值:GET、POST、DELETE。
23. Content-Transfer-Encoding
概念: 描述文件在传输过程中的编码格式。
枚举值:7BIT(默认值,以ASC-II格式的格式编码),BASE64, QUOTED-PRINTABLE, 8BIT, BINARY, X-TOKEN
客户端和服务端共有的字段
1. Connection
概念:表示当前事务完成后,是否需要持久链接,即是否需要关闭TCP连接。
枚举值:
keep-alive:保持该网络打开,这是HTTP/1.1请求的默认值。
close:客户端或服务器想要关闭连接,这是HTTP/1.0请求的默认值。
2. Cache-Control
概念:是否使用缓存机制,是 HTTP/1.1中规定的字段。
- 共有的枚举值
no-cache: 不使用缓存。
no-store: 不适应缓存,也不会保存到临时文件中。
no-transfrom:客户端希望获取服务端实体数据,没有被转化过(如压缩)的资源,服务端希望客户端缓存时不可对实体数据做任何转化。
only-if-cached:客户端希望获取缓存的内容,而不用发起请求;或者服务端告知代理服务器,客户端希望获取缓存的内容,而不用发起请求。
max-age=31536000:希望资源缓存时间。max-age<=0 时不设置缓存过期时间。文件有修改,重新请求,没有修改返回304。
cache-extension:自定义拓展值。
- 客户端的枚举值
max-stale[=31536000]:愿意接收一个超出缓存时间的资源,若有定义,则为 31536000 秒,若没有,则为任意超出的时间。
min-fresh=31536000:希望接收一个小于 31536000 秒内被更新的资源。
- 服务端的枚举值
public: 任何情况下,都缓存资源。浏览器和缓存服务器都可以缓存页面信息。
private: 缓存给部分用户(如代理服务器)。
must-invalidate:当前资源是向原服务器发去验证请求的,若请求失败会返回504,而非代理服务器上的缓存。
proxy-invalidate:当前资源是向代理服务器发去验证请求的,而非原服务器上的缓存。
s-maxage=31536000:告诉客户端该资源在 31536000 秒内无需重新发送请求,应用于共享缓存。
3. Encoding
概念:使用何种编码格式,客户端为 Accept-Encoding,服务端为 Content-Encoding。
枚举值:
gzip:采用 Lempel-Ziv coding (LZ77) 压缩算法,以及32位CRC校验的编码方式。
compress:采用 Lempel-Ziv-Welch (LZW) 压缩算法。
deflate:采用 zlib 结构和 deflate 压缩算法。
br:表示采用 Brotli 算法的编码方式。
identity:用于指代自身(例如:未经过压缩和修改)。除非特别指明,这个标记始终可以被接受。
*:匹配其他任意未在该首部字段中列出的编码方式。假如该首部字段不存在的话,这个值是默认值。它并不代表任意算法都支持,而仅仅表示算法之间无优先次序。
4. Language
概念:使用何种语言信息,客户端为 Accept-Language,服务端为 Content-Language。
枚举值:de、de-CH、en-US、en。
三、报文头总结归纳
将以上报文头归纳为以下几个类别
1. 信息约定类
- 客户端
Accept(约定文档类型)、Accept-Encoding(约定编码格式)、Accept-Language(约定语言)、Connection(约定是否长连接)、X-Requested-With(客户端发送的请求类型)、Authorization(服务端验证身份信息)
- 服务端
Content-Type(约定文档类型)、Content-Encoding(约定编码格式)、Content-Language(约定语言)、Connection(约定是否长连接)、X-Content-Type-Options(是否禁止浏览器嗅探行为)、X-DNS-Prefetch-Control(告诉浏览器要做DNS预解析)、X-Frame-Options(是否禁用 iframe 连接)、X-XSS-Protection(是否防止XSS攻击)、Access-Control-(预检请求)
2. 信息披露类
- 客户端
Host(主机信息)、Origin(网页来源)、Referer(引用来源)、From(发布者邮箱)、Cookies(浏览器缓存)、User-Agent(当前浏览器信息)
- 服务端
Server(服务器信息)、Date(报文创建时间)、Accept-Ranges(可接收的范围单位)、Content-Range(数据片段在文件中的位置)、Content-Length(文本长度)
3. 缓存相关类(详情请看以下内容四)
Cache-Control(是否启动缓存)、Pragma(是否启用缓存,旧版) 、Last Modified(文件最后修改时间)、Expires(文件过期时间)、ETag(文件的唯一标识符)、If-None-Match、If-Match、If-Modified-since(文件的修改时间)、If-Unmodified-since(文件未修改时间)、Vary(是否需要缓存)
四、缓存相关报文头
1. 缓存开关
有 Pragma 和 Cache-Control ,Pragma 是以前版本的东西,为了向下兼容才保留,如果同时出现 Pragma 和 Cache-Control ,以 Pragma 为主。
2. 缓存校验
由 Expires(过期时间)、Last Modified(最后修改时间) 、ETag(唯一标识符)三种策略同时检验。
- 首先检验过期时间 Expires,如果没有过期,则直接读取浏览器缓存;
- 如果过期了,服务端会检验 ETag,将客户端携带的 If-None-Match(上次请求时服务端返回的 Etag) 与 服务端存储的 Etag 对比,如果一致,则返回 304,读取浏览器缓存;
- 如果不一致,则检验 Last Modified,将客户端携带的 If-Modified-since(上次请求时服务端返回的 Last Modified)与服务端存储时间对比,如果小于服务端的时间,则读取缓存。否则重新请求数据,请求成功后返回200。
Etag 是服务器会对文件进行一系列算法生成的唯一的标识(类似于文件的md5值),在 Apache中,ETag 的值默认是对文件的索引节点(INode),大小(Size)和最后修改时间(MTime)进行 Hash 后得到的,为什么加入 ETag校验?有了 Expires,为什么还要有 Last Modified?
- 引入 Last Modified 是为了防止客户端与服务端 Expires 时间不一致。
- 而 Last-Modified 只能精确到秒级,如果在1秒之内修改,则不能重新标注修改时间;
- 有些文件会定期生成,所以修改时间变了,但是内容没有变,不希望重新请求;
- 服务器时间获取错误或与代理服务器时间不一致。
3. 缓存优先级
1)Cache-Control 与 Expires 时间同时存在时,Cache-Control 时间会覆盖 Expires 时间。
2)在 Cache-Control 字段中,Cache-Control 的值是可以组合使用的,多个值如果冲突时,也是有优先级的, no-store 优先级最高。