HTTP首部

HTTP首部_第1张图片
Do More

因为工作的原因吧,在这里把HTTP首部总结一下,做一个学习笔记。由于HTTP版本或扩展规范的变化,首部字段可支持的字段内容略有不同。本文主要涉及HTTP/1.1及常用的首部字段。

先说一下HTTP首部字段吧,有的书上也称为HTTP消息头,本文以首部简之。首部是构成HTTP报文的要素之一,在客户端与服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部,它能起到传递额外重要信息的作用。首部构成是这样的,首先是首部字段,后面跟着冒号(:),然后跟上可选的空格,再跟上字段值,最后是一个CRLF。

HTTP规范定义了几种首部。应用程序也可以随意发明自己所用的首部。HTTP首部可以分为以下几类。

  • 通用首部

    既可以出现在请求报文中,也可以出现在响应报文中。

  • 请求首部

    从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容优先级等信息。

  • 响应首部

    从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。

  • 实体首部

    针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。

  • 扩展首部

    扩展首部是非标准的首部,由应用程序开发者创建,但还未添加到已经批准的HTTP规范中去。即使不知道这些扩展首部的含义,HTTP程序也要接受并对其进行转发。

通用首部

首部字段名 说明
Cache-Control 控制缓存的行为。
Connection 逐跳首部、连接的管理。允许客户端和服务器指定与请求/响应连接有关的选项,用于告诉通信的另一端,在完成HTTP传输之后是关闭TCP连接还是保持连接开放以接受其他消息。
Date 创建报文的日期时间。说明报文是什么时间创建的。
Pragma 报文指令。另一种随报文传送指示的方式
Trailer 报文末端的首部一览。如果报文采用了分块传输编码(chunked transfer encoding)方式,就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合。
Transfer-Encoding 指定报文主体的传输编码方式。如果使用这个首部,通常用它制定块编码。
Upgrade 升级为其他协议。给出了发送端可能想要“升级”使用的新版本或协议
Via 代理服务器的相关信息。显示报文经过的中间节点(代理、网关)
Warning 错误通知。

请求首部

首部字段名 说明
Accept 用户代理可处理的媒体类型。
Accept-Charset 优先的字符集。
Accept-Encoding 优先的内容编码。
Accept-Language 优先的语言(自然语言)。
Authorization Web认证信息。包含了客户端提供给服务器以便对其自身进行认证的数据。
Expect 期待服务器的特定行为。
From 用户的电子邮箱地址。
Host 请求资源所在服务器。
If-Match 比较实体标记(ETag),如果匹配,就获取这份文档。
If-Modified-Since 比较资源的更新时间。这个首部用于说明浏览器最后一次收到所请求的资源的时间,如果自那以后资源没有发生变化,服务器会发出一个带状态码304的响应,指示浏览器使用资源的缓存副本。
If-None-Match 比较实体标记(与If-Match相反)。
If-Range 资源未更新时发送的实体Byte的范围请求。允许对文档的某个范围进行条件请求。
If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)。
Max-Forwards 最大传输逐跳数。在通往源端服务器的路径上,将请求转发给其他代理或网关的最大次数——与TRACE方法一同试用。
Proxy-Authorization 代理服务器要求客户端的认证信息。
Range 实体的字节范围请求。
Referer 对请求中的URI的原始获取方,或者说是提供了包含当前URI文档的URL
TE 传输编码的优先级。
User-Agent HTTP客户端程序的信息。

响应首部

首部字段名 说明
Accept-Ranges 是否接受字节范围请求。
Age 推算资源创建经过时间。
ETag 资源的匹配信息。
Location 令客户端重定向至指定URI。
Proxy-Authenticate 代理服务器对客户端的认证信息。
Retry-After 对再次发起请求的时机要求。
Server HTTP服务器的安装信息。
Vary 代理服务器缓存的管理信息。服务器查看其他首部的列表,可能会使响应发生变化,也就是说,这是一个首部列表,服务器会根据这些首部的内容挑选出来最合适的资源版本发送给客户端。
WWW-Authenticate 服务器对客户端的认证信息。用在带401状态码的响应中,提供与服务器所支持的身份验证类型有关的信息。

实体首部

首部字段名 说明
Allow 资源可支持的HTTP方法。
Content-Encoding 实体主体适用的编码方式。
Content-Language 实体主体的自然语言。
Content-Length 实体主体的大小(单位:字节)。用于规定消息主体的字节长度。(HEAD语法的响应例外,它在对应的GET请求的响应中指出主体的长度)
Content-Location 代替对应资源的URI。
Content-MD5 实体主体的报文摘要。
Content-Range 实体主体的位置范围。
Content-Type 实体主体的媒体类型。
Expires 实体主体过期的日期时间。
Last-Modified 资源的最后修改日期时间。

在 HTTP 协议通信交互中使用到的首部字段,不限于 RFC2616 中定义的 47 种首部字段。还有 Cookie、 Set-Cookie 和 Content-Disposition 等在其他 RFC 中定义的首部字段,它们的使用频率也很高。自定义专用首部可通过'X-' 前缀来添加;其他的首部在 IANA 注册表 中列出,其原始内容在 RFC 4229中定义。IANA 同时还维护了被提议的新HTTP 首部注册表。

扩展首部

首部字段名 说明
Cookie 服务器接收到的Cookie信息。
Origin 在跨域Ajax请求中,用于指示提出请求的域。
Access-Control-Allow-Origin 指示可否通过跨域Ajax请求获取资源。
Set-Cookie 开始状态管理所使用的Cookie信息。
X-Frame-Options 用户控制网站内容在其他Web网站的Frame标签内显示问题。其主要目的是为了防止点击劫持(clickJacking)攻击。
Strict-Transport-Security 网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。 HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP。 另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。

接下来将一些常见的进行一个详细描述。

  1. Cache-Control

    通过指定首部Cache-Control的指令,就能操作缓存的工作机制。指令的参数是可选的,多个指令之间通过“,”分隔。参数有很多这里介绍几个常见的。

    no-cache

    使用no-cache指令的目的是为了防止从缓存中返回过期的资源。

    客户端请求包含no-cache指令,表示不接收缓存过的响应。于是中间的缓存服务器必须把请求转发给源服务器。

    服务器响应包含no-cache指令,表示缓存服务器不能对资源进行缓存。源服务器以后也将不会再对缓存服务器请求中提出的资源有效性进行确认,禁止其对响应资源进行缓存操作。

    no-store

    使用no-store指令时,暗示请求(和对应的响应)或响应中包含机密信息。因此该指令规定缓存不能在本地存储请求或响应的任何一部分。

    从字面上很容易把no-cache误解为不缓存,但事实上no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源。no-store才是真正地不进行缓存。

    max-age

    客户端请求包含max-age指令,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。

    服务器响应包含max-age指令,缓存服务器将不对资源的有效性再做确认,而max-age数值代表资源保存为缓存的最长时间。

    应用HTTP/1.1版本的缓存服务器遇到同时存在Expires首部的,优先处理max-age指令,忽略Expires;HTTP/1.0版本的正好相反。

    private

    指定private指令后,响应只以特定的用户作为对象,缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

  2. Connection

    Connection首部具有如下两个作用:

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

    控制不再转发上

    Connection:不再转发的首部字段名

    管理持久连接上

    HTTP/1.1版本默认连接都是持久连接。当服务器想明确断开连接时,则会使用Connection: close

    HTTP/1.1之前版本的默认连接都是非持久连接。为此,想在旧版本的HTTP协议上维持持续连接则需要使用Connection: Keep-Alive。

  3. Server

    首部Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息,不单单会标出服务器上软件应用的名称,而且还有可能包括版本号和安装时启用的可选项。

  4. Set-Cookie

    控制浏览器处理cookie的方式,其包含一些可选属性。

    NAME=VALUE(必选项)

    赋予Cookie的名称和值

    expires=DATE

    expires属性指定浏览器可发送Cookie的有效期。

    当省略时,其有效期仅限于维持浏览器会话(Session)时间段内。另外一旦Cookie从服务器发送到客户端,服务器就不存在可以显式删除Cookie的方法,但可以通过覆盖已过期的Cookie,实现对客户端Cookie的实质性删除操作。

    path=PATH

    用于指定cookie的有效URL路径,限制指定URL可以发送该cookie,不过另有办法可以避开这项限制。

    domain=域名

    用于指定cookie的有效域。这个域必须和收到的cookie的域相同,或者是它的父域。

    secure

    添加该属性时,仅在HTTPS请求中才可提交该cookie

    HttpOnly

    如果添加该属性,将无法通过客户端JavaScript直接访问cookie,可防止XSS攻击。

  5. Vary

    从代理服务器接收到源服务器返回包含Vary指定项的响应后,若要再进行缓存,仅对请求中含有相同Vary指定首部的请求返回缓存。即使对相同资源发起请求,但由于Vary指定的首部不相同,因此必须要从源服务器重新获取资源。

  6. Host

    首部Host会告知服务器,请求的资源所处的互联网主机名和端口号。Host首部在HTTP/1.1规范内是唯一一个必须包含在请求内的首部字段。主要与单台服务器分配多个域名的虚拟主机有关。

  7. User-Agent

    首部User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。

  8. Accept

    Accept首部可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用type/subtype这种形式,一次指定多种媒体类型。

    若想增加优先级,则使用q=来表示权重,用分号(;)分隔,q取值0~1,默认q=1.0。

  9. Referer

    在客户端请求中插入Referer首部,可以使服务器知道客户端是从哪里获得其请求的URL的。这是一种对服务器有益的自愿行为,这样服务器就可以更好的记录请求或执行其他任务了。

    浏览器所做的工作相当简单,如果在主页A上点击一个链接,进入主页B,浏览器就会在请求中插入一个带有A值得Referer首部,自己输入的URL中不会包含Referer首部。

  10. Cookie

Cookie可以笼统的分为两类,会话cookie和持久cookie,两者区别就是过期时间。会话cookie是一种临时cookie,他记录了用户访问站点时的设置和偏好,用户退出浏览器时,会话cookie就被删除了。通常用持久cookie维护某个用户周期性访问的站点的配置文件或登录名。

如有错误,欢迎指正。

你可能感兴趣的:(HTTP首部)