当前位置: 首页 > news >正文

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写的简单代理服务器。

    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-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优先,不进行缓存。
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秒
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对再次发起请求的时机要求
ServerHTTP服务器的安装信息
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 协议族内的其他众多的协议相同&#xff0c;用于客户端和服务器之间的通信。 请求访问文本或图像等资源的一端称为客户端&#xff0c;而提供资源响应的一端称为服务器端。 HTTP 协议规定&#xff0c;请求从客户端发出&#xf…...

探索后量子安全:基于格加密技术的未来密码学展望

在信息技术日新月异的今天&#xff0c;量子计算作为下一代计算技术的代表&#xff0c;正逐步从理论走向实践。量子计算的出现对现有的加密体系构成了严重威胁&#xff0c;尤其是基于大数分解和离散对数难题的传统密码学&#xff08;如RSA和Diffie-Hellman协议&#xff09;。为了…...

WPF之UI进阶--完整了解wpf的控件和布局容器及应用

前面三篇有关WPF的基础介绍&#xff0c;分别介绍了wpf与winform的异同&#xff0c;wpf的事件生成和使用以及数据绑定。但我们还缺乏一副好的“皮囊”&#xff0c;所以从这篇开始我们来开始学习wpf的UI相关的内容&#xff0c;首当其冲的就是布局容器。 其实我们知道&#xff0c;…...

unity一键注释日志和反注释日志

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

VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

甄选范文“论软件需求管理”,软考高级论文,系统架构设计师论文

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

Android Studio Dolphin 中Gradle下载慢的解决方法

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

Excel实现省-市-区/县级联

数据准备 准备省份-城市映射数据&#xff0c;如下&#xff1a; 新建sheet页&#xff0c;命名为&#xff1a;省-市数据源&#xff0c;然后准备数据&#xff0c;如下所示&#xff1a; 准备城市-区|县映射数据&#xff0c;如下&#xff1a; 新建sheet页&#xff0c;命名为&#x…...

【优化代码结构】函数的参数归一化

某些封装的函数&#xff0c;其参数具有多样性&#xff0c;会导致函数中会增加非常多的分支&#xff0c;比如下面这个 format 函数有如下几种参数方式&#xff0c;其中 formatter 会有很多种情况 date&#xff1a;日期对象formatter&#xff1a; ‘date’&#xff1a;格式化日期…...

CSS中height设置100vh和100%的区别

文章目录 CSS中height设置100vh和100%的区别一、引言二、高度设置的区别1、100%1.1、父元素高度固定1.2、父元素高度未定义 2、100vh2.1、视口高度2.2、不受父元素限制 三、总结 CSS中height设置100vh和100%的区别 一、引言 在前端开发中&#xff0c;我们经常需要设置元素的高…...

红米k60至尊版工程固件 MTK芯片 资源预览 刷写说明 与nv损坏修复去除电阻图示

红米k60至尊版机型代码为:corot。 搭载了联发科天玑9200+处理器。此固件mtk引导为MT6985。博文将简单说明此固件的一些特点与刷写注意事项。对于NV损坏的机型。展示修改校验电阻的图示。方便改写参数等 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2…...

QEMU使用Qemu-Guest-Agent传输文件、执行指令等

简介 之前介绍过qemu传输文件&#xff0c;使用的挂载 / samba方式 &#xff1a;Qemu和宿主机不使用外网进行文件传输。 这是一种方式&#xff0c;这里还有另一种方式&#xff1a;使用Qemu-Guest-Agent&#xff0c;后面简称qga。 官网介绍&#xff1a;https://www.qemu.org/d…...

【漏洞复现】金和OA C6 GeneralXmlhttpPage.aspx Sql注入漏洞

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…...

复数表示的电场

Exm加是复振幅&#xff0c;这是用复数表示电场&#xff0c;并提取只与空间有关的项复振幅就是复数表示电场&#xff0c;且把与空间xyz有关的量提取出来 经过验证实数E0cos&#xff08;wtδx&#xff09;对t求导&#xff0c;等于E0e^j(wtδx)对t求导再取实部 实数表示电磁波cos…...

常用快捷键整理

用加粗标注的是我个人使用时常用的&#xff0c;其实这个全凭个人喜好&#xff0c;大家可以熟悉一下自己喜欢的&#xff0c;都多试试&#xff0c;把觉得有用的记一下&#xff0c;多使用&#xff0c;后续写代码效率就会提高一些) 常用 VS 运行调试程序快捷键 编译 . 编译程序&a…...

【Transformer】长距离依赖

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;长距离依赖&#xff08;Long-Range Dependencies&#xff09;指的是在文本中相隔较远的两个或多个元素之间的依赖关系。这些依赖关系可以是语法上的&#xff0c;也可以是语义上的。例如&#xff0c;在句子中&#xff0…...

Git傻傻分不清楚(下)

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

golang学习笔记27-反射【重要】

本节也是GO核心部分&#xff0c;很重要。包括基本类型的反射&#xff0c;结构体类型的反射&#xff0c;类别方法Kind()&#xff0c;修改变量的值。 目录 一、概念&#xff0c;基本类型的反射二、结构体类型的反射三、类别方法Kind()四、修改变量的值 一、概念&#xff0c;基本…...

利用Puppeteer-Har记录与分析网页抓取中的性能数据

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

YOLOv5改进系列(1)——添加CBAM注意力机制

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

无头单向非循环java版的模拟实现

【本节目标】 1.ArrayList的缺陷 2.链表 1. ArrayList的缺陷 上节课已经熟悉了 ArrayList 的使用&#xff0c;并且进行了简单模拟实现。通过源码知道&#xff0c; ArrayList 底层使用数组来存储元素&#xff1a; public class ArrayList<E> extends AbstractList<…...

Bert Score-文本相似性评估

Bert Score Bert Score 是基于BERT模型的一种方法。它通过计算两个句子在BERT模型中的嵌入编码之间的余弦相似度来评估它们的相似度。BERTScore考虑了上下文信息和语义信息&#xff0c;因此能够更准确地衡量句子之间的相似度。 安装 pip install bert-score 使用例子 一个…...

Pyenv管理Python版本,conda之外的另一套python版本管理解决方案

简介 Pyenv 是一个 python 解释器管理工具&#xff0c;可以对计算机中的多个 python 版本进行管理和切换。为什么要用 pyenv 管理python呢&#xff0c;用过的 python 人都知道&#xff0c;python 虽然是易用而强大的编程语言&#xff0c;但是 python 解释器却有多个版本&#…...

快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标

Fivetran 现已支持 Milvus 向量数据库作为数据迁移的目标&#xff0c;能够有效简化 RAG 应用和 AI 搜索中数据源接入的流程。 数据是 AI 应用的支柱&#xff0c;无缝连接数据是充分释放数据潜力的关键。非结构化数据对于企业搜索和检索增强生成&#xff08;RAG&#xff09;聊天…...

css的页面布局属性

CSS Flexbox&#xff08;Flexible Box Layout&#xff09;是一种用于页面布局的CSS3规范&#xff0c;它提供了一种更加高效的方式来布置、对齐和分配容器内元素的空间&#xff0c;即使它们的大小是未知或者动态变化的。Flexbox很容易处理一维布局&#xff0c;即在一个方向上&am…...

RTE 大会报名丨AI 时代新基建:云边端架构和 AI Infra ,RTE2024 技术专场第二弹!

所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0c;如何构建高可用的云边端协同架构&#xff1f; 语音 AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频的爆炸增长&#xff0c;给新一代编解码技术提出了什么新挑战&#xff1f; 当大模型进化到实时多模态&am…...

【React】入门Day01 —— 从基础概念到实战应用

目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发&#xff0c;是用于构建 Web 和原生…...

<<机器学习实战>>10-11节笔记:生成器与线性回归手动实现

10生成器与python实现 如果是曲线规律的数据集&#xff0c;则需要把模型变复杂。如果是噪音较大&#xff0c;则需要做特征工程。 随机种子的知识点补充&#xff1a; 根据不同库中的随机过程&#xff0c;需要用对应的随机种子&#xff1a; 比如 llist(range(5)) random.shuf…...

链表OJ经典题目及思路总结(一)

目录 前言1.移除元素1.1 链表1.2 数组 2.双指针2.1 找链表的中间结点2.2 找倒数第k个结点 总结 前言 解代码题 先整体&#xff1a;首先数据结构链表的题一定要多画图&#xff0c;捋清问题的解决思路&#xff1b; 后局部&#xff1a;接着考虑每一步具体如何实现&#xff0c;框架…...

初识chatgpt

GPT到底是什么 首先&#xff0c;我们需要了解GPT的全称&#xff1a;Generative Pre-trained Transformer&#xff0c;即三个关键词&#xff1a;生成式 预训练 变换模型。 &#xff08;1&#xff09;什么是生成式&#xff1f; 即能够生成新的文本序列。 &#xff08;2&#…...

玻璃行业做的非常有设计感的网站/品牌网站建设方案

Java输入输出流 生活中无处不在&#xff0c;只要涉及到传输。复制粘贴操作;修改头像&#xff0c;将本地数据上传到网络服务器。 System.out.println("mtianyan");将字符串输出到屏幕上。 字符从河流中依次通过&#xff0c;形成了字符流。 流就是指一连串流动的字符,以…...

做网站360推广多少钱/潍坊网站定制模板建站

前面有个return下面的txtBox1.Focus();当然无法访问了。应该把return放到txtBox1.Focus()后面...

辽宁网站建设/详情页设计

主要软件包&#xff0c; 1. httpd-2.2.6.tar.gz 2. mysql-5.0.45-linux-i686-glibc23.tar.gz ( 这个版本是已编译好的压缩包&#xff0c;解压后稍做配置即可使用 ) 3. php-5.2.5.tar.gz 安装 php 所需的软件包&#xff08;其中 libxml2 是安装 php5 必须的 . &#xff09; 1. l…...

WordPress支持熊掌号/百度官方优化软件

一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个 Shell 脚本主要 由原本需要在命令行输入的命令组成&#xff0c; 或在一个文本编辑器中&#xff0c; 用户可以使用脚 本来把一些常用的操作组合成一组串行。 主要用来书写这种脚本的语言叫做脚本 语言。 很多脚本语言…...

成品网站建设价格/网站不收录怎么解决

Nginx作为当前最流行的负载均衡和反向代理服务器,它运行在linux平台,一般的.net网站,为了实现分流与负载,需要在多个应用服务器的IIS上部署,通过一些工具实现代码的同步,然后再nginx上去配置它们. 有了docker,你可以在多个linux上花个1秒钟去run它即可,不用在iis上部署了,对于d…...

网站制作公司多少人/郑州做网站最好的公司

需求&#xff1a; 从网上下载的N张.png图片保存到image目录中&#xff0c;将下载下来的图片全部重命名test1.png/test2.png... 实现代码&#xff1a; 目录结构&#xff1a; config-->setting.py #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ tian __data__ …...