图解HTTP第六章:HTTP首部

学习HTTP首部的结构和首部中各字段的用法。

HTTP首部字段

使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。

  • 首部字段对应单个HTTP首部可以有多个值。如果首部字段重复,根据浏览器逻辑处理,有的以第一个为准,有的以最后出现的为准。
  • 4种首部字段类型
    • 通用首部字段(General Header Fields)
    • 请求首部字段(Request Header Fields)
    • 响应首部字段(Response Header Fields)
    • 实体首部字段(Entity Header Fields):针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间与实体有关的信息。
  • 首部字段一览

    在HTTP通信过程中,不限于以下规范中的字段,还有CookieSet-CookieContent-Disposition等字段。

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

HTTP首部字段根据缓存代理和非缓存代理的行为,分成2种类型(也可以根据类型分为通用、请求、响应、实体首部字段):

  • 端到端首部(End-to-end Header)

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

  • 逐跳首部(Hop-by-hop Header)

    此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。必需要提供Connnection字段才能使用hop-by-hop首部。它们有(除了这些全是端到端首部):

    Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade

通用首部字段:

  • Cache-Control:通过该命令,就能操作缓存的工作机制;参数是多选的,通过,分隔。

    • 表示能否缓存的指令:

      Cache-Control:public,表明其他用户也可以利用缓存

      Cache-Control:private,只让特定用户缓存,缓存服务器会对该特定用户提供资源缓存的服务。

    • no-cache指令:

      请求使用时,则表示客户端将不会接收缓存过的响应,于是缓存服务器必须转发给源服务器。

      响应使用时,则表示缓存服务器不能缓存资源,源服务器也不对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。

    • 控制可执行缓存对象的指令no-store

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

    • 指定缓存期限和认证的指令
    • max-age=60(秒)

      请求使用时,则判定缓存资源的缓存时间,小就获取缓存,大则缓存服务器转发给源服务器。

      响应使用时,缓存服务器将不对资源的有效性再作确认,该时间表示资源有效时间。

    • s-maxage=60(秒):功能和max-age指令相同,但s-maxage只适用于供多位用户使用的公共缓存服务器。即对同一用户重复返回响应的服务器不起作用。使用s-maxage后,Expiresmax-age会被忽略。
    • min-refresh=60(秒):要求缓存服务器返回至少还未过指定时间的缓存资源。
    • max-stale=60(秒):表示缓存资源即使过期,但仍处于该指令指定时间内,仍旧会被客户端接收。如未指定具体数值,则缓存资源一直有效。
    • only-if-cached:要求缓存服务器不重新加载响应,也不确认资源的有效性,直接返回。若缓存服务器无该缓存,则返回504。
    • must-revalidate:代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法连接到源服务器的话,则返回504。使用must-revalidate时会忽略max-stale指令。

      如果缓存过了新鲜期,则必须重新验证.而不是试图返回一个不在新鲜期的缓存.与no-cache的区别在于,no-cache,完全无视新鲜期的概念.总是强制重新验证.理论上,must-revalidate更节省流量,但相比no-cache,可能并不总是那么精准.因为即使缓存者,认为是新鲜的,也不能保证服务器端没有做过更新.如果缓存者是一个缓存代理服务器,如果其试图重新验证时,无法连接上原始服务器,则也不允许返回一个不新鲜的,缓存中的副本.而是必须返回一个504 Gateway timeout.

    • proxy-revalidate:限制上与must-revalidate类似.区别在于受体的范围.proxy-revalidate,是要排除掉用户代理(浏览器)的缓存的.即,其规则并不应用于用户代理的本地缓存上.
    • no-transform:无论请求还是响应中,缓存都不能改变实体主体的媒体类型,可以防止缓存或代理压缩图片等操作。
    • cache-extension:通过该指令标记,可以扩展Cache-Control首部字段内的指令。

  • Connection:

    两个作用:

    • 控制不再转发给代理的首部字段

      客户端发送请求和服务器返回的响应内,使用Connection首部字段可控制不再转发给代理的首部字段(Hop-by-hop首部)。

    • 管理持久连接

      Connection:closeConnection:Keep-Alive表示服务端想断开连接或保持持久连接。

  • Date:表明HTTP报文的日期和时间
  • Pragma:Progma:no-cache遗留字段, 只在客户端发送的请求中,要求缓存服务器不返回缓存的资源。
  • Trailer:说明在报文主体后记录了哪些首部字段。可应用在分块传输编码时。
  • Transfer-Encoding:规定了传输报文主体时采用的编码方式。仅对分块传输编码有效。
  • Upgrade:在使用该字段时,需额外指定Connection:Upgrade,用于检测是否可使用更高的版本进行通信,可以指定一个完全不同的通信协议。
  • Via:追踪客户端和服务器之间的请求和响应报文的传输路径,可以避免请求回环的发送。报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后转发。
  • Warning:告知用户一些与缓存相关的问题的警告。

请求首部字段

  • Accept:可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可用用type/subtype这种形式,一次指定多种媒体类型。
  • Accept-Charset:通知服务器用户代理支持的字符集及字符集的相对优先顺序。可一次指定多种字符集。
  • Accept-Encoding:告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次指定多种内容编码。gzipcompressdeflateidentity
  • Accept-Language:告知服务器用户代理能够处理的自然语言集,以及优先级。可一次指定多种。
  • Authorization:
  • Expect:告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望作出回应而发生错误时,会返回417 Expectation Failed。
  • From:告知服务器用时用户代理的用户的电子邮件地址。
  • Host:虚拟主机运行在同一个IP上,使用Host区分。必须被包含在请求内的首部字段。
  • 形如If-xxx这种请求首部,都可成为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
    • If-Match:它会告知服务器匹配资源所用的实体标记(ETag)值,这时的服务器无法使用弱ETag值。服务器会对比If-Match的字段值和资源的ETag值,仅当两者一致时,才会执行请求;反之,返回412 Precondition Failed。可以使用*指定If-Match值,服务器会忽略ETag值,只要资源存在就处理请求。
    • If-None-Match:和If-Match作用相反。只有在If-None-Match值与ETag值不一致时,可处理该请求。
    • If-Modified-Since:服务器在If-Modified-Since值后资源更新过,则处理该请求;如果没有更新过,则返回304 Not Modified。用于确认代理或客户端拥有的本地资源的有效性。
    • If-Range:告知服务器指定的If-Range值(ETag值或时间)和请求资源的ETag值或时间相一致时,则作为范围请求处理;反之,则返回全体资源。一般和Range请求头连用。
    • If-Unmodified-Since:和If-Modified-Since相反。指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。反之返回412 Precondition Failed。
  • Max-Forwards:通过Trace或OPTIONS方法,发送包含首部字段Max-Forwards请求时,十进制整数,每转发一次,值减一,为0值,则不再转发,直接返回响应。
  • Proxy-Authorization:接收到从代理服务器发来的认证质询时,客户端会使用该首部,以告知服务器认证所需要的信息。
  • Range:获取部分资源的范围请求。成功处理时,返回206 Partial Content响应;无法处理时,返回200 OK。
  • Referer:会告知服务器请求的原始资源的URI。
  • TE:告知服务器客户端能够处理的传输编码方式及相对优先级。和Accept-Encoding功能很像,但用于传输编码。

    还可以指定伴随trailer字段的分块传输编码方式,只需要TE:trailers来指明。

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

响应首部字段

  • Accept-Ranges:用来告知客户端服务器是否能处理范围请求,以指定获取服务器某个部分的资源。两个值:Accept-Ranges:bytesAccept-Ranges:none
  • Age:单位是秒。指源服务器多久前创建了响应;如果是缓存服务器时,表示缓存后的响应再次发起认证到认证完成的时间值。代理创建的响应必须加上Age。
  • ETag:ETag能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式,服务器会为每份资源分配对应的ETag值。

    强ETag值:实体发生的细微变化都会改变其值

    弱ETag值:只用于提示资源是否相同,只有发生根本性改变,ETag值才会变化,会在字段值开始处附加W/

  • Location:将响应接收方引导至某个与请求URI位置不同的资源。基本上它会和3xx : Redirection重定向一块使用。几乎所有浏览器在接收到Location响应后,都会强制性的尝试对已提示的重定向资源的访问。
  • Proxy-Authenticate:把由代理服务器所要求的认证信息发送给客户端。
  • Retry-After:告知客户端应该在多久之后再次发送请求,主要配合503 Service Unavalible或3xx Redirection一起使用。字段值可以指定具体日期时间、或创建响应后的秒数。
  • Server:告知客户端当前服务器上安装的HTTP服务器应用程序的信息,包括软件应用名称、可能还有版本号和安装时启用的可选项。
  • Vary:该首部可以对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。

    从代理服务器接收到源服务器返回包含Vary指定项的响应之后,再次接收到请求时,仅返回相同Vary首部的缓存;其它则必须要从源服务器重新获取。

  • WWW-Authenticate:用于HTTP访问认证。会告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的质询。状态码401 Unauthorized响应中,肯定有这个首部字段。

实体首部字段

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

实体:作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。

  • Allow:

    用于通知客户端能够能够支持Request-UIR指定资源的所有HTTP方法。当服务器接收到不支持的HTTP方法时,会返回状态码405 Method Not Allowed,同时会把所有能支持的HTTP方法写入首部字段Allow后返回。

  • Content-Encoding:

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

  • Content-Language:

    告知客户端,实体主体使用的自然语言。

  • Content-Length:

    表明了实体主体部分的大小(字节)。对实体主体进行内容编码传输时,不能再使用Content-Length首部字段。

  • Content-Location:

    给出与报文主体部分相对应的URI,表示返回的资源对应的URI。

  • Content-MD5:

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

  • Content-Range:Content-Range:bytes5001-10000/10000

    告诉客户端作为响应返回的实体的哪个部分符合范围请求。以字节为单位,表示当前发送部分及整个实体大小。

  • Content-Type:

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

  • Expires:

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

    缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定时间之前,缓存一直有效。超过是,会向源服务器请求资源。

    源服务器不希望缓存服务器对资源缓存时,在Expries字段内写入与首部字段Date相同的时间值。

    当Cache-Control指定了max-age指令时,会有限处理。

  • Last-Modified

    指明资源最终修改时间。

为Cookie服务的首部字段

  • Set-Cookie:

    • name:必须项。name=xxx
    • expires:指定浏览器可发送Cookie的有效期。
    • path:可用于限定Cookie的发送范围的文件目录。不能保证安全。
    • domain:通过该属性指定的域名可做到与结尾匹配一致即可发送Cookie。
    • secure:该属性用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie。Set-Cookie:name=xxx;secure

      HttpOnly:使Js脚本无法获得Cookie,防止XSS(Cross-site scripting)对Cookie的信息窃取。Set-Cookie:name=xxx;HttpOnly

  • Cookie:告知服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。接收到多个Cookie时,可以以多个Cookie形式发送。

参考:

你应该了解的 一些web缓存相关的概念.

时间: 2024-10-13 16:28:33

图解HTTP第六章:HTTP首部的相关文章

图解HTTP读书笔记_第六章 http首部

6.1HTTP报文首部 1.http协议的请求和响应报文必包含HTTP首部 HTTP协议的请求和响应报文中必定包含HTTP首部,首部内容为客户端和服务器端分别处理请求和响应所提供的的信息. HTTP请求报文:在请求中,HTTP报文由方法.URI.HTTP版本.HTTP首部字段等部分组成 HTTP响应报文:在响应中,HTTP报文由HTTP版本.状态码(数字和原因短语).HTTP首部字段3部分组成. 6.2 HTTP首部字段 1.请求和响应都会使用首部字段,使用首部字段是为了给浏览器和服务器提供报文

C#图解教程 第六章 深入理解类

深入理解类 类成员成员修饰符的顺序实例类成员静态字段从类的外部访问静态成员 静态字段示例静态成员的生存期 静态函数成员其他静态类成员类型成员常量常量与静态量属性 属性声明和访问器属性示例使用属性属性和关联字段执行其他计算只读和只写属性属性与公共字段计算只读属性示例自动实现属性静态属性 实例构造函数 带参数的构造函数默认构造函数 静态构造函数对象初始化语句析构函数readonly修饰符this关键字索引器 什么是索引器索引器和属性声明索引器索引器的set访问器索引器的get访问器关于索引器的补充为

图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

?图解?TCP/IP? 第六章?TCP与UDP? ?笔记6.1 传输层的作用 ? 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程序所有进行处理的具体程序. ? 6.1.1 传输层定义 6.1.2 通信处理 ? 6.1.3 两种传输层协议 TCP和UDP TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,你可以把它想象成排水管道中的水流. UDP 是不具有可靠性的数据包协议 .细微的处理会交给上层的应用去完成.在U

《图解Http》 2-6章: 基础,报文,状态码,首部。

HTTP协议和Cookie 是stateless协议,自身不对请求和响应之间的通信状态进行保存.但随着技术发展,为了实现保存状态的功能,引入了Cookie技术. Cookie在请求和响应报文中写入信息来控制客户端的状态. Cookie根据从服务器发送的响应报文内的Set-Cookie的首部字段信息,通知客户端保存Cookie. 下次客户端发送请求时,会在报文中加入Cookie值. 服务器收到报文后,检查Cookie,确认是哪个客户端发过来的连接请求,然后再对比服务器上的记录,得到之前的状态信息.

数据库系统实现 第六章 查询执行

第六章 查询执行 查询执行也就是操作数据库的算法 一次查询的过程: 查询-->查询编译(第七章)-->查询执行(第六章)-->数据 查询编译预览 查询编译可以分为三个步骤: a)分析:构造分析树,用来表达查询和它的结构 b)查询重写,分析树被转化为初始查询计划,通常是代数表达式,之后初始的查询计划会被优化为一个时间更小的计划 c)物理计划生成,将查询计划转化成物理的计划, 为了选择更好的查询计划,需要判断 1)查询哪一个代数的等价形式是最有效的 2)对选中形式的每一个操作,所使用的算法选

第六章:异常机制

第六章:异常机制 异常的定义 异常:在程序运行过程中出现的意外事件,导致程序中断执行. 异常处理 try...catch 语法:try{ //可能出现异常的代码}catch(异常类型 异常对象名){ //处理异常的代码:}执行过程:当try中的代码异常发生时抛出一个异常对象,该异常对象与catch中异常类型进行匹配,匹配成功进入catch块,否则不执行catch中代码(相当于异常未被处理).程序只有当异常处理成功后才能继续执行. try...catch...catch 语法:try{ //可能出

2017上半年软考 第六章 重要知识点

第六章 项目整体管理 []项目整体管理概述 [][]项目整体管理的含义.作用和过程 项目整体管理6个过程?p264 项目整体管理包括什么? 项目管理的核心是什么? 项目整体管理涉及哪几个方面?p265 [][]项目经理是整合者 项目经理作为整合者要做什么?p265 [][]整体管理的地位 []项目整体管理实现过程 [][]制定项目章程概述 项目章程的意义是什么? 项目章程包括什么? [][]制定项目章程 项目章程的作用? 项目章程的输入? 制定项目章程的工具和技术?p267 项目章程的输出?p2

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片:多对多关系(上)

这章介绍了怎样创建一个新的实体来管理图片,怎样使用HTML窗体来上传图片文件和使用多对多关系来使它们与产品相关,并且怎样来保存图片到文件系统中.这章也介绍了更多复杂的错误处理增加客户端错误到模型中为了把它们显示回给用户.在这章中播种数据库使用的产品图片可能在在第六章的从Apress网页站点下载代码中. 注意:如果你想遵从这章的代码,你必须完成第五章的代码或者从www.apress.com下载第五章的源代码作为一个起点. 创建实体保存图片文件名 这个项目,我们正要使用文件系统在Web项目中存储图片

Linux与云计算——第二阶段Linux服务器架设 第六章:目录Directory服务器架设—FreeIPA

Linux与云计算--第二阶段Linux服务器架设 第六章:目录Directory服务器架设-FreeIPA 1 FreeIPA 配置FreeIPA服务器 Configure IPA Server to share users' account in your local network. [1] Install FreeIPA. [[email protected] ~]# yum -y install ipa-server ipa-server-dns bind bind-dyndb-lda