HTTP系列——首部字段

HTTP协议——HTTP通用首部(经常使用)

通用首部字段名

通用首部字段名 说明
Cache-Control 控制缓存的行为
Connection 容许客户单和服务器指定与请求/响应连接有关的选项
Date 建立报文的日期时间

Cache-Control

Cache-Control请求指令:
指令 参数 说明
no-cache 强制向源服务器再次验证
no-store 规定缓存不能在本地存储请求的任一部分
max-age=[秒] 必须 好比max-age=31536000,缓存一年
Cache-Control缓存响应指令:
指令 说明
public 可向任意方提供响应的缓存
private 仅向特定用户返回响应
no-cache 缓存前必须先确认其有效性
no-store 规定缓存不能在本地存储响应的任一部分
max-age=[秒] 响应的最大Age值
补充

no-cache:并不意味着不缓存。它的意思是在使用缓存资源以前,它必须通过服务器的检查(revalidate也能够实现这个功能)。
no-store:才是告诉浏览器不要缓存它。
max-age
资源的内容很是稳定,长时间内都不会发生变动,那么咱们就能够声明浏览器/CDN能够长时间缓存该资源(31536000秒,即一年),只要用户不手动清理浏览器缓存,一年内源服务器都再也不会收到(当前浏览器/CDN)对该资源的请求。
推荐前端静态资源缓存最优解以及max-age的陷阱html

Connection

字段 说明
keep-alive 维持长连接
close 关闭连接
keep-alive说明补充

Connection: Keep-Alive 是用于 HTTP持久链接 的字段。前端

close模式和keep-alive模式的请求对比:算法

image

Keep-Alive的优缺

优势:keep-alive 模式更加高效,由于避免了链接创建和释放的开销
缺点:长时间的 tcp 链接容易致使系统资源无效占用,浪费系统资源浏览器

HTTP协议——HTTP请求首部(经常使用)

请求首部字段名

请求首部字段名 说明
Host 给出了接收请求的服务器的主机名和端口号
Referer 提供了包含当前请求URL的文档的URL
User-Agent 将发起请求的应用程序名称告知服务器
Accept 服务器能够处理的内容类型(MIME_type)
Accept-Encoding 编码方式(gzip:LZ77压缩算法;compress:LZW 压缩算法;identity:自身)
If-Modified-Since 搭配Last-Modified实现协商缓存
If-None-Match 搭配ETag实现缓存
Authorization 用户凭证;好比(Bearer xxxx)
Cookie 浏览器每次发送请求都会携带

Referer

我在www.google.com 里有一个www.baidu.com 连接,那么点击这个www.baidu.com ,它的header 信息里就有:缓存

Referer=http://www.google.com
Referer的做用:
  • 防盗链

我只容许我本身的网站访问我本身的图片服务器,那个人域名是www.google.com,那么图片服务器每次取到Referer来判断一下是否是我本身的域名www.google.com,若是是就继续访问,不是就拦截。服务器

  • 防止恶意请求。

动态请求是时候,必须 Referer 为我本身的网站。cookie

Accept

请求头用来告知(服务器)客户端能够处理的内容类型,这种内容类型用MIME类型来表示。服务器能够从诸多备选项中选择一项进行应用,并使用Content-Type应答头通知客户端它的选择。app

Accept字段
Accept字段 信息
<MIME_type>/<MIME_subtype> 单一精确的 MIME 类型, 例如text/html.
<MIME_type>/* 一类 MIME 类型, 可是没有指明子类。 image/* 能够用来指代 image/png, image/svg, image/gif 以及任何其余的图片类型。
*/* 任意类型的 MIME 类型
;q= (q因子权重) 值表明优先顺序,用相对质量价值表示,又称做权重。
Accept: text/html

Accept: image/*

Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8

HTTP协议——HTTP响应首部(经常使用)

响应首部字段名

字段 信息
Age 我也没弄懂,干啥的
Server 服务器应用程序软件的名称和版本
Vary 决定了对于将来的一个请求头
Set-Cookie 服务器端向客户端发送 cookie

Vary

Vary实现动态服务

Vary: User-Agent
例如你提供给移动端的内容是不一样的,可用防止你客户端误使用了用于桌面端的缓存。 并可帮助Google和其余搜索引擎来发现你的移动端版本的页面,同时告知他们不须要Cloaking。tcp

Vary: Accept-Encoding不一样的客户端压缩编码的方式可能不一样,可能有的客户端不支持压缩,那么服务器端返回的数据就不能压缩,须要服务器端作不一样的数据返回。对于这个问题的解决经过添加Vary的Accept-Encoding告诉服务器支持的类型,来返回特定数据ide

HTTP协议——HTTP实体首部(经常使用)

实体首部字段名

实体首部字段 信息
Allow 枚举资源所支持的 HTTP 方法的集合
Content-Encoding 对主体执行的任意编码方式
Content-Length 主体的长度或者尺寸
Content-Type 这个主体的对象类型
ETag 与此实体相关的实体标记
Last-Modified 这个实体最后一次被修改的日期和时间

Allow

当服务器接收到不支持的 HTTP 方法时,会以状态码405 Method Not Allowed 做为响应返回。与此同时,还会把全部能支持的 HTTP 方法写入首部字段 Allow 后返回。

Expires

缓存过时时间,用来指定资源到期的时间,是服务器端的具体的时间点。

Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过时时间前浏览器能够直接从浏览器缓存取数据,而无需再次请求。

Expires: Wed, 04 Jul 2012 08:26:05 GMT
#经过HTTP的META设置expires和cache-control
<meta http-equiv="Expires"  content="Wed, 04 Jul 2012 08:26:05 GMT">//仅对该网页有效,对网页中的图片或其余请求无效
ps

若是在Cache-Control响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略

Expires 是 HTTP/1 的产物,受限于本地时间,若是修改了本地时间,可能会形成缓存失效。

补充

Content-Encoding和Content-Type及服务器和客户端处理流程

# Response Headers(响应头部)
Content-Encoding: gzip
Content-Type:text/plain;charset=iso-8859-1

以返回hello信息为例:
服务端浏览器发送了一条信息:hello
首先,服务端要告诉浏览器,我给你发的这条数据的类型,不一样类型的数据,接收方的处理方式不同则须要设置Content-Type:text/plain;charset=iso-8859-1告诉浏览器怎么处理;

由于计算机只知道0和1,这时候浏览器收到的应该是:
01101000(h) 01100101(e) 01101100(l) 01101100(l) 01101111(o)

若是咱们对'hello'进行gzip算法压缩;那么二进制串已经发生了改变;因此咱们还须要告诉浏览器Content-Encoding: gzip

服务器-->Content-Type:text/plain和Content-Encoding:gzip
-->浏览器-->先解析压缩算法Content-Encoding:gzip-->
先解析压缩算法Content-Encoding:gzip-->后解析Content-Type

Last-Modified和If-Modified-Since的关系

浏览器在第一次访问资源时,服务器返回资源的同时,在Response Headers中添加 Last-Modified,值是这个资源在服务器上的最后修改时间:

Last-Modified: Fri, 23 Oct 2020 07:33:48 GMT

浏览器再次请求该资源,则Request Headers添加

If-Modified-Since: Fri, 23 Oct 2020 07:33:48 GMT

服务器再次收到这个资源请求,会根据If-Modified-Since值与服务器中这个资源的最后修改时间对比。若是没有变化,返回304和空的响应体,直接从缓存读取;若是If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,因而返回新的资源文件和200;

ETag和If-None-Match

浏览器在第一次访问资源时,服务器返回资源的同时当前资源文件的一个惟一标识在Response Headers中添加 ETag(只要资源有变化,Etag就会从新生成):

ETag: "5f92875c-6fa"

浏览器再次请求该资源,则Request Headers添加

If-None-Match: "5f92875c-6fa"

服务器只须要比较客户端传来的If-None-Match跟本身服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了

MIME 类型

MDN MIME 类型

相关博文

https 加密、http2.0、keep-alive

Accept

http的Content-Encoding和Content-Type及服务器和客户端处理流程

浏览器缓存机制

相关文章
相关标签/搜索