侧边栏壁纸
  • 累计撰写 247 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

HTTP 报文首部字段(二):请求首部篇

kaixindeken
2021-04-23 / 0 评论 / 0 点赞 / 110 阅读 / 3,944 字

1.jpeg

请求首部字段是从客户端往服务器端发送请求报文时所使用的首部字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。下面我们来简单介绍下每个请求首部字段的用途和注意事项。

Accept

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

该字段用于告知服务器用户代理(即客户端浏览器)能够处理的媒体类型及媒体类型的相对优先级。这些媒体类型都是 MIME 类型:

  • 文本文件:text/html、text/plain、text/css、application/json...
  • 图片文件:image/jpeg、image/gif、image/png...
  • 视频文件:video/mpeg、video/quicktime...
  • 应用程序使用的二进制文件:application/octet-stream、application/zip...

若想要给显示的媒体类型增加优先级,可以使用 q= 来额外表示权重值(0~1,默认值是 1.0),并用分号进行分隔。当服务器提供多种内容时,将会首选返回权重值最高的媒体类型。

Accept-Charset
该字段用来告知服务器用户代理支持的字符集及字符集的相对优先顺序。用法和 Accept 类似:

Accept-Charset: utf-8,iso-8859-1;q=0.5

Accept-Encoding

Accept-Encoding: gzip, deflate, br

该字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。常见的内容编码如下:

  • gzip:由文件压缩程序 gzip(GNU zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法及 32 位循环冗余校验(CRC);
  • compress:由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-Ziv-Welch 算法;
  • deflate:组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式;
  • br:表示采用 Brotli 算法的编码方式;
    identify:不执行压缩或不会变化的默认编码格式。

Accept-Language

用来告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级,用法和 Accept 字段类似:

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7

Authorization

用来告知服务器用户代理的认证信息。通常,想要通过服务器认证的用户代理会在接收到返回的 401 状态码响应后,把首部字段 Authorization 加入请求:

1.jpeg

Expect

该字段用于告知服务器期望出现的某种特定行为,因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码 417 Expectation Failed。

客户端可以利用该首部字段写明所期望的扩展,虽然 HTTP/1.1 规范只定义了 100-continue。这个字段平时很少用到。

From

该字段用于告知服务器使用用户代理的用户的电子邮件地址,通常,其使用目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。这个字段日常也很少用到。

Host

该字段用于告知服务器请求的资源所处的互联网主机名和端口号。该字段在 HTTP/1.1 规范内是唯一一个必须包含在请求内的首部字段,因为请求行里的 URL 资源通常是相对 URL,需要结合 Host 字段才能拼接出完整的 URL,对于一台 Web 服务器上通常部署了多个站点的情况(我们通常称之为虚拟主机),Host 必须是域名而不能是 IP 地址,Web 服务器会根据这个 Host 字段值将请求指向对应域名指定的配置目录。

If-Match

形如 If-XXX 这种样式的请求首部字段,都可称为条件请求,服务器收到附带条件的请求后,只有判断指定条件为真时,才会执行请求,常用于实现缓存相关功能。

首部字段 If-Match 属于附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值,这时的服务器无法使用弱 ETag 值(以 W/ 开头)。

服务器会对比 If-Match 字段值和资源的 ETag 值,仅当两者一致时,才会执行请求,反之,则返回状态码 412 Precondition Failed 响应。

还可以使用星号 * 指定 If-Match 的字段值,针对这种情况,服务器将会忽略 ETag 的值,只要资源存在就处理请求。

If-None-Match

该字段和 If-Match 作用相反,用于指定 If-None-Match 字段值的实体标记(ETag)值与请求资源的 ETag 不一致时,它就告知服务器处理该请求。

在 GET 或 HEAD 方法中使用请求首部字段 If-None-Match 可获取最新的资源。

If-Modified-Since

该字段会告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能够处理该请求。反之则返回状态码 304 Not Modified 响应。

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

If-Unmodified-Since

和 If-Modified-Since 作用相反。告知服务器指定的请求资源只有在字段值内指定的日期时间之后未发生更新的情况下,才能处理请求。否则以状态码 412 Precondition Failed 作为响应返回。

If-Range

该字段用于告知告知服务器若指定的 If-Range 字段值(ETag 值或时间)和请求资源的 ETag 值或时间相一致,则作为范围请求处理,否则返回全体资源。

注:后面讲到 HTTP 缓存时会详解介绍上述与缓存相关的 If-XXX 请求首部字段。

Max-Forwards

前面我们在介绍 HTTP 请求方法时提到过,通过 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

该字段用于告知服务器当前请求的上一个请求对应资源的 URL:

Referer: https://laravelacademy.org/laravel-docs-5_8

客户端一般都会发送 Referer 首部字段给服务器,但当直接在浏览器地址栏输入 URL 时,出于安全考虑,可以不发送该首部字段。

Referer 的正确拼写应该是 Referrer,但不知为何,大家都沿用了这个错误的拼写。

TE

该字段用于告知服务器客户端能够处理响应的传输编码方式及相对优先级,和首部字段 Accept-Encoding 的功能类似,所以一般很少见。

除了指定传输编码外,还可以指定伴随 Trailer 字段分块传输编码的方式,应用后者时,只需把 trailers 赋值该该字段即可。

User-Agent

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

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like 
0

评论区