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-alivetcp连接并未断开,图中不同颜色的线标记了复用的tcpid

设置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 GMTDate描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。

同样,浏览器上不能设置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写的简单代理服务器。

    js 复制代码
    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则表示客户端将不会接收缓存过的响应。于是,中间的缓存服务器必须把客户端请求转发给源服务器。

    在上面的简单代理服务器中添加多一个判断:

    js 复制代码
    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-fresh60 秒后,过了 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-cachePragmaHTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0 的向后兼容而定义。

所有的中间服务器如果都能以 HTTP/1.1 为基准,那直接采用 Cache-Control: no-cache 指定缓存的处理方式是最为理想的。但要整体掌握全部中间服务器使用的 HTTP 协议版本却是不现实的。因此,发送的请求会同时含有下面两个首部字段。

Cache-Control: no-cache            
Pragma: no-cache

pragma值有no-cacheno-store两个选项。

pragmacache-controlexpires同时出现时优先级顺序:pragma -> cache-control -> expires

例:

  1. 同时设置了三个,pragma优先,不进行缓存。
js 复制代码
res.setHeader('Cache-Control', 'max-age=30');
res.setHeader('pragma', 'no-cache');
res.setHeader('expires', new Date(new Date().getTime() + 2000).toGMTString())
  1. 同时设置了cache-controlexpirescache-control优先,会被缓存30秒
js 复制代码
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
相关推荐
ZZZCY200317 分钟前
OSPF路由计算
前端·javascript·网络
虽千万人 吾往矣1 小时前
golang rpc
开发语言·后端·网络协议·tcp/ip·golang
limengshi1383922 小时前
通信工程学习:什么是DQDB分布式队列双总线
网络·学习·信息与通信
limengshi1383923 小时前
通信工程学习:什么是MAC媒体接入控制
网络·网络协议·学习·信息与通信
StevenZeng学堂3 小时前
一文掌握Harbor镜像同步公有云镜像仓库实践
网络·阿里云·云原生·kubernetes·华为云·云计算·go
.浓茶3 小时前
IP协议讲解
网络·tcp/ip·智能路由器
橘猫0.o4 小时前
虚拟机、ubantu不能连接网络,解决办法
linux·运维·服务器·网络
大嘴巴子5 小时前
华为源NAT技术与目的NAT技术
运维·服务器·网络
2101_824775825 小时前
华为设备所有查看命令以及其对应作用
网络·网络协议·网络安全·华为