6HTTP首部

HTTP 协议的请求和响应报文中必定包含HTTP 首部,只是我们平时在使用Web 的过程中感受不到它。本章我们一起来学习HTTP首部的结构,以及首部中各字段的用法。

6.1 HTTP报文首部

首部内容为客户端和服务器分别处理和响应提供所需要的信息。

HTTP请求报文

在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-miOosmcK-1678848313956)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220830105153052.png)]

HTTP响应报文

在响应中,HTTP 报文由HTTP 版本、状态码(数字和原因短语)、HTTP 首部字段3 部分构成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G27qCPoi-1678848313957)(…/…/AppData/Roaming/Typora/typora-user-images/image-20220830105400613.png)]

6.2 HTTP首部字段

6.2.1 HTTP首部字段传递重要信息

传递额外重要信息

6.2.2 HTTP首部字段结构

首部字段名:字段值

6.2.3 4中HTTP首部字段类型

通用首部字段(General Header Fields)
请求首部字段(Request Header Fields)
响应首部字段(Response Header Fields)
实体首部字段(Entity Header Fields)

6.2.4 HTTP/1.1 首部字段一览

HTTP/1.1 规范定义了如下47 种首部字段。

6.2.5 非HTTP/1.1首部字段

在HTTP 协议通信交互中使用到的首部字段,不限于RFC2616 中定义的47 种首部字段。还有Cookie、Set-Cookie 和Content-Disposition等在其他RFC 中定义的首部字段,它们的使用频率也很高。

6.2.6 End-to-end首部和Hop-by-hop首部

HTTP首部字段将定义成缓存代理和非缓存代理的行为,分为2种类型

端到端首部

分在此类别中的首部会转发给请求/ 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

逐跳首部

分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用hop-by-hop 首部,需提供Connection 首部字段。

●●Connection

●●Keep-Alive
●●Proxy-Authenticate
●●Proxy-Authorization
●●Trailer
●●TE
●●Transfer-Encoding
●●Upgrade

其他所有字段都属于端到端首部

6.3 HTTP/1.1 通用首部字段

6.3.1 Cache-Control

通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制

指令的参数是可选的,多个指令之间通过,分隔

Cache-Control:private,max-age=0,no-cache

6.3.2 Connection

  • 控制不再转发给代理的首部字段
  • 管理持久连接

6.3.3 Date

表明创建HTTP报文的日期和时间

6.3.4 Pragma

Pragma 是HTTP/1.1 之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义。

属于通用首部字段,但只用在客户端发送的请求中。

6.3.5 Trailer

首部字段Trailer 会事先说明在报文主体后记录了哪些首部字段

6.3.6 Transfer-Encoding

规定传输报文主体时采用的编码方式

仅对分块传输编码有效

6.3.7 Upgrade

首部字段Upgrade 用于检测HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。

6.3.8 Via

追踪客户端与服务器之间的请求和响应报文的传输路径

6.3.9 Warning

该首部通常会告知用户一些与缓存相关的问题的警告。

6.4 请求首部字段

用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容

6.4.1 Accept

通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级

使用type/subtype这种形式,一次指定多种媒体类型

  • 文本文件

    text/html,text/plain,text/css…

    application/xhtml+xml,application/xml…

  • 图片文件

    image/jpeg,image/gif,image/png…

  • 视频文件

    video/jpeg,image/gif,image/png…

  • 应用程序使用的二进制文件

    application/octet-stream,aplication/zip…

使用q=来额外表示权重值,用分号(;)进行分隔,范围是0~1,默认1.0最大

6.4.2 Accept-Charset

通知服务器用户代理支持的字符集及字符集的相对优先顺序

可一次指定多种字符集

采用权重q来表示优先级

6.4.3 Accept-Encoding

Accept-Encoding: gzip,deflate

告知服务器用户代理支持的内容编码及内容编码的优先级

可一次指定多种内容编码

  • gzip
  • compress
  • default
  • identity

采用权重q来表示优先级

可用星号*作为通配符,指定任意的编码格式

6.4.4 Accept-Language

首部字段Accept-Language 用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。

q来表示相对优先级

6.4.5 Authorization

用户代理的认证信息(认证值)

6.4.6 Expect

告知服务器,期望出现某种特定的行为。

因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码417 Expectation Failed

6.4.7 From

使用用户代理的用户的电子邮箱地址

6.4.8 Host

虚拟主机在用一个IP,需要添加HOST进行区分。

6.4.9 If-Match

条件请求

服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

6.4.10 If-Modified-Since

If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段Last-Modified 来确定

6.4.11 If-None-Match

与If-Match作用相反

在GET 或HEAD 方法中使用首部字段If-None-Match 可获取最新的资源。因此,这与使用首部字段If-Modified-Since 时有些类似

6.4.12 If-Range

首部字段If-Range 属于附带条件之一。它告知服务器若指定的If-Range 字段值(ETag 值或者时间)和请求资源的ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。

6.4.13 If-Unmodified-Since

告知服务器,指定的请求资源在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。

如果在指定日期时间后发生了更新,则以状态码412 Precondition Failed作为响应返回

6.4.14 Max-Forwards

该字段以十进制整数形式指定可经过的服务器最大数目

6.4.15 Proxy-Authorization

接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization 的请求,以告知服务器认证所需要的信息。

6.4.16 Range

获取部分资源的范围请求

处理成功返回状态码 206 Partial Content

处理失败,返回状态码200 OK 及全部内容

6.4.17 Referer

告知服务器请求的原始资源URI

客户端一般都会发送Referer 首部字段给服务器。但当直接在浏览器的地址栏输入URI,或出于安全性的考虑时,也可以不发送该首部字段。因为原始资源的URI 中的查询字符串可能含有ID 和密码等保密信息,要是写进Referer 转发给其他服务器,则有可能导致保密信息的泄露。

6.4.18 TE

告知服务器客户端能够处理响应的传输编码方式及相对优先级。

6.4.19 User-Agent

将创建请求的浏览器和用户代理名称等信息传达给服务器

6.5 响应首部字段

由服务器端向客户端返回响应报文种所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。

6.5.1 Accept-Ranges

告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源

可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none。

6.5.2 Age

能告知客户端,源服务器在多久前创建了响应。单位为秒

6.5.3 ETag

资源更新后,ETag值会随之改变

首部字段能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag 值。

强ETag值和弱ETag值

强ETag值

无论实体发生多么细微的变化都会改变其值

弱ETag值

弱ETag值只用于提示资源是否相同。只有资源发生了根本变化,产生差异时才会改变ETag值

6.5.4 Location

将响应接收方引导至某个与请求URI位置不同的资源

基本上,该字段会配合3xx :Redirection 的响应,提供重定向的URI。

6.5.5 Proxy-Authenticate

首部字段Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端。

6.5.6 Retry-After

首部字段Retry-After 告知客户端应该在多久之后再次发送请求。

主要配合状态码503 Service Unavailable响应或3xx Redirect响应一起使用

字段值可以指定具体的时间,也可以是创建响应后的秒数

6.5.7 Server

告知客户端当前服务器上安装的HTTP服务器应用程序的信息

6.5.8 Vary

可对缓存进行控制

当代理服务器接收到带有Vary 首部字段指定获取资源的请求时,如果使用的Accept-Language 字段的值相同,那么就直接从缓存返回响应。反之,则需要先从源服务器端获取资源后才能作为响应返回

6.5.9 WWW-Authenticate

用于HTTP访问认证。

它会告知客户端适用于访问请求URI 所指定资源的认证方案(Basic 或是Digest)和带参数提示的质询(challenge)。状态码401 Unauthorized 响应中,肯定带有首部字段WWW-Authenticate

6.6 实体首部字段

包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息

6.6.1 Allow

通知客户端能够支持Request-URI指定资源的所有HTTP方法

当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回

会把所有能支持的HTTP方法写入首部字段Allow后返回

6.6.2 Content-Encoding

告知客户端服务器对实体的主体部分选用的内容编码方式。

内容编码是指在不丢失实体信息的前提下所进行的压缩。

  • gzip
  • compress
  • deflate
  • identity

6.6.3 Content-Language

告知服务器,实体主体使用的自然语言

6.6.4 Content-Length

实体主体部分的大小(单位字节)

6.6.5 Content-Location

给出与报文主体部分相对应的URI

6.6.6 Content-MD5

首部字段Content-MD5 是一串由MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。

6.6.7 Content-Range

针对范围请求,返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求

6.6.8 Content-Type

说明了实体主体内对象的媒体类型。

字段值用type/subtype形式赋值

参申诉charset使用iso-8859-1或euc-jp等字符集进行赋值

6.6.9 Expires

将资源失效的日期告知客户端。

6.6.10 Last-Modified

指明资源最后修改的时间

6.7为Cookie服务的首部字段

管理服务器与客户端之间状态的Cookie

Cookie的用户机制是用户识别及管理状态

首部字段名说明首部类型
Set-Cookie开始状态管理所使用的Cookie信息响应首部字段
Cookie服务器接收到的Cookie信息请求首部字段

6.7.1 Set-Cookie

Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; ⇒
path=/; domain=.hackr.jp;
属性说明
NAME=VALUE赋予Cookie的名称和其值(必须项)
expires=DATACookie的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名)
Secure仅在HTTPS安全通信时才会发送Cookie
HttpOnly加以限制,使Cookie不能被JavaScript脚本访问

6.7.2 Cookie

Cookie :status=enable

6.8 其他首部字段

可自行扩展

在Web服务器和浏览器的应用上,会出现个各种非标准的首部字段

6.8.1 X-Frame-Options

X-Frame-Options: DENY

属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。主要目的是为了防止点击劫持(clickjacking)攻击

  • DENY 拒绝
  • SAMEORIGIN 仅同源域名下的页面匹配时许可

6.8.2 X-XSS-Protection

属于HTTP响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。

  • 0:将XSS过滤设置为无效状态
  • 1:将XSS过滤设置成有效状态

6.8.3 DNT

属于HTTP请求首部

DNT是Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。

  • 0:同意被追踪
  • 1:拒绝被追踪

由于首部字段DNT的功能具备有效性,所以WEB服务器需要对DNT做对应的支持

6.8.4 P3P

属于HTTP响应首部

通过利用P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

要进行P3P的设定,需按以下操作步骤进行“

  1. 创建P3P隐私
  2. 创建P3P隐私对照文件后,保存命名在/w3c/p3p.xml
  3. 从P3P隐私中新建Compact policies后,输出到HTTP响应中
    对策,用于控制浏览器XSS防护机制的开关。
  • 0:将XSS过滤设置为无效状态
  • 1:将XSS过滤设置成有效状态

6.8.3 DNT

属于HTTP请求首部

DNT是Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。

  • 0:同意被追踪
  • 1:拒绝被追踪

由于首部字段DNT的功能具备有效性,所以WEB服务器需要对DNT做对应的支持

6.8.4 P3P

属于HTTP响应首部

通过利用P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

要进行P3P的设定,需按以下操作步骤进行“

  1. 创建P3P隐私
  2. 创建P3P隐私对照文件后,保存命名在/w3c/p3p.xml
  3. 从P3P隐私中新建Compact policies后,输出到HTTP响应中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Toreme

随缘喜赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值