HTTP报文头解析(图文)

2023-05-16

一.通用头部字段 (General Header Fields)

该字段在请求头和响应头都会使用到,下方是常用的通用头部字段:

1、Cache-Control

用来操作缓存的工作机制,下方截图响应头中的的Cache-Control的参数为private和max-age=10。private缓存是私有的,仅像特定用户提供相应的缓存信息。如果是public,那么就意味着可向任意方提供相应的缓存信息。max-age = 10表示缓存有效期为10秒。从下方的Expires(过期时间)和Last-Modified(最后修改时间)就可以看出,这两者之间的差值正好是10秒。

该字段还可以对应其他的参数:

  • no-cache:如果是客户端的话,说明客户端不会接收缓存过的响应,要请求最新的内容。而服务器端则表示缓存服务器不能对相应的资源进行缓存。
  • no-store:表示缓存不能在本地存储。
  • max-age:该参数后方会被赋值上相应的秒数,在请求头中表示如果缓存时间没有超过这个值就返回给我。而在响应头中时,则表示资源在缓存服务器中缓存的最大时间。
  • only-if-cached:表示客户端仅仅请求缓存服务器上的内容,如果缓存服务器上没有请求的内容,那么返回504 Gateway Timeout。
  • must-revalidata:表示缓存服务器在返回资源是,必须向资源服务器确认其缓存的有效性。
  • no-transform:无论请求还是响应,都不能在传输的过程中改变报文体的媒体类型。

  

 

2、Connection

该字段可以控制不转发给代理服务器的首部字段以及管理持久连接,下方这个响应报文头中的Connection就是用来管理持久连接的,其参数为keep-alive,就是保持持久连接的意思。可以使用close参数将其关闭。

  

 

3、Transfer-Encoding

该字段表示报文在传输过程中采用的编码方式,在HTTP/1.1的报文传输过程中仅对分块编码有效。下方这个截图就是Transfer-Encoding在Response Header中的使用,后边根的chunked(分块)的参数,说明报文是分块进行传输的。

  

 

4、Via

该字段是为了追踪请求和响应报文测传输路径,报文经过代理或者网关是会在Via字段添加该服务器的信息,然后再进行转发。

  

  

 

二.请求头部字段 (Request Header Fields)

顾名思义,请求头部字段当然是在请求头中才使用的字段。该字段用于补充请求的附加信息,客户端信息等。接下来将给出常用而且比较重要的几个请求头部字段。

1  Accept

该字段可通知服务器用户代理能够处理的媒体类型以及该媒体类型对应的优先级。媒体类型可使用“type/subtype”这种形式来指定,分号后边紧跟着的是该类型的优先级。如下所示。

  

 

2  Accept-Encoding

该字段用来告知服务器,客户端这边可支持的内容编码以及相应内容编码的优先级, 下方就是Accept-Encoding的用法。gzip表示由文件压缩程序gzip(GNU zip)生成的编码格式。compress表示UNIX文件压缩程序compress生成的编码格式。deflate表示组合使用zlib格式以及有deflate压缩算法生成的编码格式。identity表示不执行压缩或者使用一致的默认编码格式。

  

 

3 Accept-Language

该字段用来告知服务器,客户端可处理的自然语言集,以及对应语言集的优先级。以下方的截图为例,Accept-Language后方跟了三个属性,分别是“zh-CN”, "zh;q=0.8",“en;q=0.6”。也就是说客户端可处理三种自然预言集,zh-CN,其优先级是1(最高)。第二种是zh ,其优先级是0.8,次之。第三个是en,优先级为0.6,优先级在三者之间最低。

  

 

4 Authorization

用来告知服务器用户端的认证信息,下方就是连接公司内部SVN系统时需要认证时的请求头部信息。

  

如果你没有填写认证信息的话,那么就会返回401 Unauthorized。如下所示:

  

 

5 If-Match 与If-None-Match

上面这两个请求头部字段都是带有逻辑判断的,从上面的英文我们不难看出两者恰好相反。两者后方都跟着串字符串,如If-Match "xcsldjh49773hce", 后边这个字符的匹配对象是ETag(稍后会介绍)。If-Match的请求是如果后方的字符串与ETag相等则服务器端进行请求,否则不进行处理。If-None-Match是If-Match的非操作,同样是匹配ETag, 如果Etag没有匹配成功就处理请求,否则不处理。

 

6 If-Modified-Since与If-Unmodified-Since

If-Modified-Since也是带有逻辑判断的请求头部字段,该字段后方跟的是一个日期,意思是在该日期后发生了资源更新,那么服务器就会处理该请求。If-Unmodified-Since就是 If-Modified-Since的非操作。

  

 

7 If-Range

if-Range字段后方也是跟的Etag, 该字段要结合着Range字段进行使用。其所代表的意思就是如果Etag匹配成功,请求的内容就按照Range字段所规定的范围进行返回,否则返回全部的内容。用法如下所示:

If-Range: "etag_code" 

Range: bytes=1000-5000

 

8  Referer 

 其实Referer是一个错误的拼写,但是一直在使用。正确的英文单词应该是Referrer(此处可翻译为:来历、来路)。Referer字段后方跟的是一个URI, 该URI就是发起请求的URI,具体如下所示:

  

 

9  User-Agent

该字段会将请求方的浏览器和用户代理名称等信息传达给服务器。下方就是从我当前笔记本的Chrome浏览器请求网络时的User-Agent信息。

  

 

 

三.响应头部字段 (Request Header Fields)

聊完请求报文头部字段后,我们接下来来聊一下响应报文头部字段。响应头是由Server向Client返回响应报文中使用的头部信息。用户补充响应的附加信息、服务信息等。下方是几个常见响应头部字段。

 

1  Accept-Ranges

该字段用来告知客户端服务器那边是否支持范围请求(请求部分内容,请求头中使用Range字段)。Accept-Ranges的值为bytes时,就说明服务器支持范围请求,为none时,说明服务器不支持客户端的范围请求。下方是博客园的页面的加载,从下方可以看出是支持范围请求的,如下所示:

  

 

2 Age

该字段告知客户端,源服务器在多久前创建了该响应。

  

 

3 Etag

Etag是服务器当前请求的服务器资源(图片,HTML页面等)所对应的一个独有的字符串。不同资源间的Etag是不同的,当资源更新时Etag也会进行更新。

所以结合着请求头中的If-Match等逻辑请求头,可以判断当前Client端已经加载的资源在服务器端是否已经更新了。当初次请求一个资源,如图片时,我们可以将其Etag进行保存,在此请求时,可放在If-None-Match后方,进行资源更新。如果服务器资源并未修改,就不对该请求做出响应。下方就是网页中某张图片对应着的Etag,如下所示。

  

 

4 Location

Location字段一般与重定向结合着使用。下方是我访问“www.baidu.com/hello”这个连接的响应报文。因为服务器上并没有/hello这个资源路径,所以给我重定向了error.html页面,这个重定向的URL就存储在Location字段中,如下所示:

  

 

5 Server

该响应字段表明了服务器端使用的服务器型号,下方是博客园某张图片的响应头,使用的Web服务器是Tengine, Tengin是淘宝发起的Web服务器项目,是基于Nginx的,关于Tengin的相关内容,请自行Google吧。

  

 

6 Vary 

Vary可对缓存进行控制,通过该字段,源服务器会向代理服务器传达关于本地缓存使用方法的命令。下方就是Vary的使用,Vary后方的参数是Accept-Encoding。其意思是返回的缓存要以Accept-Encoding为准。当请求的Accept-Encoding的参数与缓存内容的Accept-Encoding参数一致时就返回缓存内容,否则就请求源服务器。

  

 

7 WWW-Authenticate

该字段用于HTTP的访问认证,在状态码401 Unauthorized中肯定带有此字段,该字段用来指定客户端的认证方案(Basic或者Digest)。参数realm的字符串是为了辨别请求URL指定资源所受到的保护策略。如下所示:

  

 

 

四、实体头部字段(Content Header Fields)

 接下来我们就来聊聊常见的实体头部字段,实体头部字段是报文实体所使用的头部,用来补充与报文实体相关的信息。

1  Allow

该字段用于服务器通知客户端服务器这边所支持的所有请求方法(GET、POST等)。如果服务器找不到客户端请求中所提到的方法的话,就会返回405 Method Not Allowed,于此同时还会把所有能支持的HTTP方法写入到首部字段Allow后返回。

Allow : GET, POST, HEAD, PUT, DELETE 

 

2 Content-Encoding

该字段用来说明报文实体的编码方式,下方这段报文头中的Content-Encoding的参数为gzip,说明是使用gzip对报文实体进行压缩的。

  

 

3 Content-Language

该字段表示报文实体使用的自然语言,使用方式如下所示:

Content-Language: zh-CN

 

4 Content-Length

顾名思义,该字段用来指定报文实体的字节长度,如下所示:

  

 

5 Content-MD5

该字段中存储的是报文实体进行MD5加密然后再使用Base64进行编码的字符串。客户端收到响应报文后,可以对报文实体进行MD5加密,然后再对其进行Base64编码,然后与Content-MD5中的字符串进行比较来确定报文是否进行修改,可以说这是一个简单的验签功能。但是此方法并不能确定报文是否被修改了,因为Content-MD5这个值也有可能被篡改。

 

五、Cookie相关的头部字段

因为HTTP协议本身是无状态的,在Web站点中使用Cookie来管理服务器与客户端之间的状态。解析来我就来介绍一下Cookie相关的头部字段。

 

1、Set-Cookie

响应报文中会使用到该字段。当服务器准备开始管理客户端的状态时,会事先告知其各种信息。下方字段是登录知乎时所返回的所要设置的Cookie信息。接下来我们就要对这串Cookie信息进行解析。

  • 键值对:在Set-Cookie字段中,“z_co=Mi4……”这就是要存入Cookie中的信息,当然可以是多个键值对,中间使用逗号进行分割即可。
  • Domain:然后是Domain属性,由下方不难看出,Domain中存储的就是Cookie适用对象的域名,若不指定Domain的值,那么默认就是创建Cookie的服务器的域名。
  • expire:该字段属性的值是一个时间,也就是Cookie的有效期,若不指定该属性的值,默认就是当前会话有效,关闭浏览器Cookie即失效。
  • httponly:设置该属性的目的是让JavaScript脚本无法获取Cookie,其主要目的是防止跨站脚本攻击对Cookie信息的窃取。
  • path: 用于限制指定Cookie的发送范围的文件目录。
  • Secure:仅在HTTPS安全通信时才会发送Cookie。

  

 

2.Cookie

请求报文头中会使用该字段,用于将本地存储的Cookie信息发送给服务端。下方就是知乎上每次请求文章所带有的Cookie信息,当然下方只是部分信息,但是我们还是从中可以找到之前我们存储的“z_co=Mi4……”这个键值对的。

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP报文头解析(图文) 的相关文章

  • HTTP 查询字符串和 []

    PHP 使用 在查询参数名称中 以确保多次出现的参数都出现在 GET超全局变量 否则只出现最后一次出现的情况 还有其他软件可以做到这一点吗 但从RFC 3986 https www rfc editor org rfc rfc3986 以及
  • 有人成功用 Robolectric 模拟 HttpRequests 吗?

    我刚刚开始使用 Robolectric 模拟大多数 Android 类似乎工作正常 但是当我的测试类尝试创建 DefaultHttpClient 时 它会收到可怕的 Stub 错误 被测试的类在这一行失败 HttpClient httpcl
  • PHP 是否有与 Java 的 RequestDispatcher.forward 等效的功能?

    在 Java 中我可以编写一个非常基本的 JSPindex jsp像这样 这样做的效果是用户请求index jsp 或者只是包含目录 假设index jsp是目录的默认文档 将会看到home action没有浏览器重定向 即 forward
  • 为什么使用 HTTP 动词?

    因为动词的目标是像 server domain getallrecords 或 server domain delete1record 或类似的 URL 而getallrecords delete1record都是专门为特定目的而设计的 为
  • 服务器返回网页 404,但页面在浏览器中显示正常 - 为什么?

    一个奇怪的网页横亘在我面前 作为一名开发人员 我必须解开这个谜团 在任何浏览器中访问网页时 一切似乎都很正常 网页按预期显示 但是当查看控制台时 服务器实际上返回了 404 状态代码 那么浏览器为什么要渲染页面呢 查看正文显示返回了有效的
  • 如何禁用 HTTP 的 HSTS 标头?

    我已将以下内容插入到我网站的 htaccess 中 以便能够访问HSTS预加载列表 https hstspreload appspot com
  • 使用特定 HTTP 方法链接到页面 (DELETE)

    如何像 Rails 那样链接到页面并让浏览器使用 DELETE 方法调用它 我试过 a href DELETE ME a 但不起作用 我使用 Node js 所以我可以用它来处理 DELETE 方法 你不能 链接只会触发 GET 请求 您可
  • Chrome 开发工具无法显示响应,即使返回的内容具有标题 Content-Type:text/html;字符集=UTF-8

    为什么我的 Chrome 开发者工具显示 无法显示响应数据 当返回的内容是text html类型时响应 在开发者工具中查看返回的响应的替代方法是什么 我认为只有当您选中 保留日志 并且您在导航离开后尝试查看先前请求的响应数据时 才会发生这种
  • ASP.NET Core URL 重写

    我正在尝试将我的网站从 www 重定向到非 www 规则以及 http 到 https https example com https example com 在中间件中 我曾经在 web config 中进行这些重定向更改 例如
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • python 2.7 中的 HTTP 2 请求

    在 python 中向 HTTP 1 和 HTTP 2 发出请求有什么区别吗 我可以像这样在 python 中进行 HTTP 1 x 调用 url http someURL values param1 key param2 key2 dat
  • 如何转义角度 HttpParams?

    在 Angular 服务中 我使用 HttpParams 将字符串发送到服务 get phone string Observable
  • JS 库请求的常见 HTTP 标头是什么?

    使用JavaScript 框架原型 http www prototypejs org 我注意到 Ajax 请求通过一个名为X Requested With 其他 JavaScript 库 如 jQuery dojo 和 YUI 是否会向其
  • UNIX/MacOS 上静态文件的“临时 Web 服务器”?

    是否有一个像小型网络服务器这样的东西 我可以从命令行调用它 只从本地文件系统获取文件并通过特定端口上的 HTTP 为它们提供服务 我希望能够做这样的事情 cd Sites mysite serve 10 0 1 1 8080 这应该会启动一
  • 最适合“正在进行的作业”的 HTTP 状态代码

    向客户端提供的最合适的 HTTP 状态代码是什么 表示 您的请求很好 但仍在进行中 请稍后在完全相同的位置回来查看 例如 假设客户端提交初始请求以启动繁重的查询 服务器立即返回一个 URL 客户端可以定期轮询该 URL 以获取结果 如果客户
  • 使用 WCF 支持“application/x-www-form-urlencoded”发布数据的最佳方式?

    我正在基于 W3C 规范构建 WCF 服务 该规范定义了接受 application x www form urlencoded 发布数据的 RESTful Web 服务端点 默认情况下 WCF 不支持这种类型的消息编码 我发现了许多创建如
  • 为什么我的 Github 托管网站响应 HTTP 302 而不是 200?

    我拥有该域名penkov id au http penkov id au 我主持一个blog http michael penkov id au blog 2014 01 02 reinventing the wheel html usin
  • put方法中的Angularjs文件上传不起作用

    我有一个简单的待办事项应用程序 我试图在其中上传照片和单个待办事项 现在我已经创建了这个工厂函数来负责待办事项的创建 todosFactory insertTodo function todo return http post baseUr
  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m

随机推荐