你还在为 HTTP 的这些概念头疼吗?(四)

简介: 上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)

响应标头

刚刚我们的着重点一直放在客户端请求,现在我们把关注点转换一下放在服务器上。响应首部字段是由服务器发送给客户端响应中所包含的字段,用于补充相应信息等,这部分标头也是非常多,我们先一起来看一下

  • Accept-Ranges
  • Age
  • ETag
  • Location
  • Proxy-Authenticate
  • Retry-After
  • Server
  • Vary
  • www-Authenticate

Accept-Ranges

Accept-Ranges HTTP 响应标头,这个标头有两个值

  • 当服务器能够处理客户端发送过来的请求时,使用bytes 来指定
  • 当服务器不能处理客户端发来的请求时,使用 none 来指定
Accept-Ranges: bytes
Accept-Ranges: none

Age

Age HTTP 响应标头告诉客户端源服务器在多久之前创建了响应,它的单位为,Age 标头通常接近于0,如果是0则可能是从源服务器获取的,如果不是表示可能是由代理服务器创建,那么 Age 的值表示的是缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段 Age。一般表示如下

Age: 24

ETag

ETag 对于条件请求来说真是太重要了。因为条件请求就是根据 ETag 的值进行匹配的,下面我们就来详细了解一下。

ETag 响应头是特定版本的标识,它能够使缓存变得更高效并能够节省带宽,因为如果缓存内容未发生变更,Web 服务器则不需要重新发送完整的响应。除此之外,ETag 能够防止资源同时更新互相覆盖。

微信图片_20220412194842.png

如果给定 URL 上的资源发生变更,必须生成一个新的 ETag 值,通过比较它们可以确定资源的两个表示形式是否相同。

ETag 值有两种,一种是强 ETag,一种是弱 ETag;

  • 强 ETag 值,无论实体发生多么细微的变化都会改变其值,一般的表示如下
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
  • 弱 ETag 值,弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETag 值。这时,会在字段值最开始处附加 W/。
ETag: W/"0815"

Location

Location 响应标头表示 URL 需要重定向页面,它仅仅与 3xx(重定向)201(已创建) 状态响应一起使用。下面是一个页面重定向的过程

微信图片_20220412194845.jpg

使用首部字段 Location 可以将响应接受方引导至某个与请求 URI 位置不同的资源。

Locationcontent-Location 是不一样的:Location 表示目标的重定向(或新创建资源的 URL)。然而 Content-Location 表示发生内容协商时用于访问资源的直接 URL,而无须进一步协商。Location 是与响应相关联的标头,而 Content-Location 与返回的实体相关联。

Location: /index.html

Proxy-Authenticate

HTTP 响应标头 Proxy-Authenticate 会定义认证方法,应该使用身份验证方法来访问代理服务器后面的资源即客户端。

它与 HTTP 客户端和服务端之间的访问认证行为相似,不同之处在于 Proxy-Authenticate 的认证双方是客户端与代理之间。它的一般表示形式如下

Proxy-Authenticate: Basic

Proxy-Authenticate: Basic realm="Access to the internal site"

Retry-After

HTTP 响应标头 Retry-After 告知客户端需要在多久之后重新发送请求,使用此标头主要有如下三种情况

  • 当发送 503(服务不可用)响应时,这表示该服务预计无法使用多长时间。
  • 当发送 429(太多请求)响应时,这表示发出新请求之前要等待多长时间。
  • 当发送重定向的响应像是 301(永久移动),这表示在发出重定向请求之前要求用户客户端等待的最短时间。

字段值可以指定为具体的日期时间,也可以是创建响应后所持续的秒数,例如

Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
Retry-After: 120

Server

服务器标头包含有关原始服务器用来处理请求的软件的信息。

应该避免使用过于冗长和详细的 Server 值,因为它们可能会泄露内部实施细节,这可能会使攻击者容易地发现并利用已知的安全漏洞。例如下面这种写法

Server: Apache/2.4.1 (Unix)

Vary

Vary HTTP 响应标头确定如何匹配请求标头,以决定是否可以使用缓存的响应,而不是从原始服务器请求一个新的响应。

Vary: User-Agent

www-Authenticate

HTTP WWW-Authenticate 响应标头定义了应用于获得对资源的访问权限的身份验证方法。WWW-Authenticate标头与401未经授权的响应一起发送。它的一般表示形式如下

WWW-Authenticate: Basic
WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"

Access-Control-Allow-Origin

一个返回的 HTTP 标头可能会具有 Access-Control-Allow-Origin ,Access-Control-Allow-Origin 指定一个来源,它告诉浏览器允许该来源进行资源访问。否则-对于没有凭据的请求 *通配符,告诉浏览器允许任何源访问资源。例如,要允许源 https://mozilla.org 的代码访问资源,可以指定:

Access-Control-Allow-Origin: https://mozilla.org
Vary: Origin

如果服务器指定单个来源而不是 *通配符的话 ,则服务器还应在 Vary 响应标头中包含 Origin ,以向客户端指示 服务器响应将根据原始请求标头的值而有所不同。

实体标头

实体标头用于HTTP请求和响应中,例如 Content-Length,Content-Language,Content-Encoding 的标头是实体标头。实体标头不局限于请求标头或者响应标头,下面例子中,Content-Length 是一个实体标头,但是却出现在了请求报文中

POST /myform.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Content-Length: 128

下面就来说一下实体标头都包含哪些

  • Allow
  • Content-Encoding
  • Content-Language
  • Content-Length
  • Content-Location
  • Content-MD5
  • Content-Range
  • Content-Type
  • Expires
  • Last-Modified

下面来分开说一下

Allow

HTTP 实体标头 Allow 列出了资源支持的方法集合。如果服务器响应405 Method Not Allowed状态码以指示可以使用哪些请求方法,则必须发送此标头。例如

Allow: GET, POST, HEAD

这段代码表示服务器允许支持 GETPOSTHEAD 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码 405 Method Not Allowed 作为响应返回。

Content-Encoding

我们上面讲过 Accept-Encoding 是客户端希望服务端返回的内容编码,但是实际上服务端返回给客户端的内容编码实际上是通过 Content-Encoding 返回的。内容编码是指在不丢失实体信息的前提下所进行的压缩。主要也是四种,和 Accept-Encoding 相同,它们是 gzip、compress、deflate、identity。下面是一组请求/响应内容压缩编码

Accept-Encoding: gzip, deflate
Content-Encoding: gzip

Content-Language

首部字段 Content-Language 会告知客户端,服务器使用的自然语言是什么,它与 Accept-Language 相对,下面是一组请求/响应使用的语言类型

Content-Language: de-DE, en-CA

Content-Length

Content-Length 的实体标头指服务器发送给客户端的实际主体大小,以字节为单位。

Content-Length: 3000

如上,服务器返回给客户端的主体大小是 3000 字节。

Content-Location

Content-Location 可不是对应 Accept-Location,因为没有这个标头哈哈哈哈。实际上 Content-Location 对应的是 Location

Location 和 Content-Location 是不一样的,Location 表示重定向的 URL,而 Content-Location 表示用于访问资源的直接 URL,以后无需进行进一步的内容协商。Location 是与响应关联的标头,而 Content-Location 是与返回的数据相关联的标头,如果你不好理解,看一下下面的表格

Request header Response header
Accept: application/json, text/json Content-Location: /documents/foo.json
Accept: application/xml, text/xml Content-Location: /documents/foo.xml
Accept: text/plain, text/* Content-Location: /documents/foo.txt

Content-MD5

客户端会对接收的报文主体执行相同的 MD5 算法,然后与首部字段 Content-MD5 的字段进行比较。

Content-MD5: e10adc3949ba59abbe56e057f20f883e

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

微信图片_20220412194854.png

Content-Range

HTTP 的 Content-Range 响应标头是针对范围请求而设定的,返回响应时使用首部字段 Content-Range,能够告知客户端响应实体的哪部分是符合客户端请求的,字段以字节为单位。它的一般表示如下

Content-Range: bytes 200-1000/67589

上段代码表示从所有 67589 个字节中返回 200-1000 个字节的内容

Content-Type

HTTP 响应标头 Content-Type 说明了实体内对象的媒体类型,和首部字段 Accept 一样使用,表示服务器能够响应的媒体类型。

Expires

HTTP Expires 实体标头包含 日期/时间,在该日期/时间之后,响应被认为过期;在响应时间之内被认为有效。特殊的值比如0表示过去的日期,表示资源已过期。

Expires: Wed, 21 Oct 2015 07:28:00 GMT

源服务器会将资源失效的日期或时间发送给客户端,缓存服务器在接受到 Expires 的响应后,会判断是否把缓存返回给客户端。

源服务器不希望缓存服务器对资源缓存时,最好在 Expires 字段内写入与首部字段 Date 相同的时间值。但是,当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。

Last-Modified

实体字段 Last-Modified 指明资源的最后修改时间,它用作验证器来确定接收或存储的资源是否相同。它的作用不如 ETag 那么准确,它可以作为一种后备机制,包含 If-Modified-SinceIf-Unmodified-Since 标头的条件请求将使用此字段。它的一般表示如下

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

总结

本篇文章主要介绍了 HTTP 四种标头的基本概念,但是并没有涵盖全部,毕竟 HTTP 标头内容确实太多了,以上介绍的基本都是平常工作中常用的一些概念,下一篇文章预告 HTTP 的黑科技

            </div>
目录
相关文章
|
4月前
|
网络协议 网络性能优化
说一说http的发展史
说一说http的发展史
|
域名解析 网络协议 大数据
小白必须掌握的几点HTTP协议的基础知识,建议收藏
1.TCP/IP的分层管理 TCP/IP协议族里重要的一点就是分层。TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层 应用层: 应用层决定了向用户提供应用服务时通信的活动。 TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(文件传输协议)和DNS(域名系统)服务就是其中两类。HTTP协议也处于该层。
149 1
小白必须掌握的几点HTTP协议的基础知识,建议收藏
|
算法 网络协议 安全
你还在为 HTTP 的这些概念头疼吗?(三)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
145 0
你还在为 HTTP 的这些概念头疼吗?(三)
|
缓存 网络协议
你还在为 HTTP 的这些概念头疼吗?(一)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
86 0
你还在为 HTTP 的这些概念头疼吗?(一)
|
XML 存储 缓存
你还在为 HTTP 的这些概念头疼吗?(四)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
96 0
你还在为 HTTP 的这些概念头疼吗?(四)
|
XML 缓存 移动开发
你还在为 HTTP 的这些概念头疼吗?(二)
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就全面一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层)
93 0
你还在为 HTTP 的这些概念头疼吗?(二)
|
测试技术
软件测试面试题:http协议有哪几种请求方式?
软件测试面试题:http协议有哪几种请求方式?
190 0
|
Web App开发 存储 网络协议
彻底搞懂HTTP协议 - 天天造轮子
彻底搞懂HTTP协议 - 天天造轮子
306 0
|
网络协议 安全
《面试官:你如何理解HTTP协议?》
《面试官:你如何理解HTTP协议?》
|
网络协议
重温HTTP,你到底做了什么?(上)
之前在回忆面试题的时候,面试官曾经问过我关于网络协议的一些东西,回答的当时感觉自己很垃圾,然后面试结束之后,自行百度,翻阅书籍,然后做了细致的整理,现在我就来分享给大家。
重温HTTP,你到底做了什么?(上)