05 前端HTTP协议(图解HTTP) 之 HTTP首部

1. HTTP 报文

HTTP报文 = 报文首部 + '空行(CR+LF)' + 报文主体
复制代码

2. HTTP首部字段类型

HTTP首部字段是构成HTTP报文的要素之一。在客户端和服务器端以HTTP协议进行通讯的过程当中,不管是请求仍是响应:都会使用首部字段,它能起到传递额外重要信息的做用。
javascript

  • 通用首部字段(General Header Fileds): 请求和响应报文都会使用的首部
  • 请求首部字段(Request Header Fields): 从客户端发起请求时使用。补充了请求的附加内容,客户端信息,响应内容相关优先级。
  • 响应首部字段(Response Header Fields): 从服务端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的信息。
  • 实体首部字段(Entity Header Fields): 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等于实体有关的信息。

3 通用首部字段


3.1 Cache-Control


// 操做缓存的工做机制。参数使用`,`分割
Cache-Control: private, max-age=0, no-cache
复制代码

public : 代表其余用户能够利用缓存
css

private: 代表只能特定用户做为对象(与public相反)。缓存服务器会对特定用户提供缓存的服务,对于其余用户发过来的请求,代理服务器不会返回缓存。
html

no-cache:从字面意义上很容易误解为不缓存,可是no-cache表明不缓存过时的资源,缓存会向服务器进行有效处理确认以后处理资源
java

  • 客户端请求包含no-cache,表示不接受缓存过的响应。
  • 中间缓存服务器必须将客户端请求转发给源服务器
  • 服务器返回中包含no-cache,代表缓存服务器不能对资源进行缓存,而且之后再也不对缓存服务器提出的资源有效性进行确认。
  • 服务器返回的no-cache=Location,指定了具体参数值,客户端接收到这个指定参数值的首部字段对应的响应报文后,不能使用缓存。若是服务器返回的no-cache无参数的首部字段是能够缓存的。

no-store: 规定缓存不能再本地存储请求或响应的一部分。
算法

s-maxage(单位秒): s-maxage指令的功能和 max-age 指令的相同,但s-maxage只适用于供多位用户使用的公共缓存服务器(通常指代理),该指令存在会直接接忽略对Expires 首部字段max-age 指令的处理。
浏览器

max-age(单位秒): HTTP/1.1的缓存服务器遇到max-age指令,会忽略Expires首部,HTTP/1.0下相反
缓存

  • 客户端发起请求包含max-age指令,若是资源缓存时间比指定的时间,客户端接收缓存资源。若是max-age=0,缓存服务器须要将请求转发给源服务器
  • 服务端返回响应包含max-age指令,缓存服务器将不对资源有效性进行再次确认,max-age表明缓存最长时间

min-fresh(单位秒): 要求缓存服务器返回小于指定时间的缓存资源。例如min-fresh=60,过了60秒的资源没法做为响应返回。
安全

max-stale(单位秒):缓存的资源即便过时了也照常接收。bash

  • 未指定参数,不管过多久,客户端都会响应
  • 指定具体值,那么即便过时,但人处于max-stale指定的时间内,仍会被客户端接收。

only-if-cached: 表示客户端 请求资源 仅在缓存服务器本地 存在缓存,不须要缓存服务器从新加载响应,也不须要确认资源有效性直接返回,若是不存在缓存,则返回状态码504 Gateway Timeout
服务器

must-revalidate: 会忽略max-stale指令, 代理服务器会向源服务器再次验证 请求的响应缓存目前任然有效代理服务器链接源服务器异常,返回504 Gateway Timeout。执行对象是被请求的代理服务器

proxy-revalidate: 要求全部的缓存服务器在接收到客户端带有该指令的请求返回响应以前, 必须再次验证缓存的有效性。例如当用户登陆,须要全部缓存代理服务器都更新文件,而不是只有被请求的缓存服务器更新。

no-transform: 不管是请求,仍是响应,缓存都不能更改实体主体的媒体类型(可防止缓存或代理 去压缩图片等操做)。

cache-extension token:
经过cache-extension 标记(token),可扩展Cache-Control首部字段内的指令。以下:若是缓存服务器不能理解commutity这个新指令,则直接忽略。所以extension tokens 只对能识别它的缓存服务器有效。

Cache-Control: private, community="UTC"
复制代码


3.2 Connection

Connection 首部: 控制再也不转发给代理的首部字段 和 管理持久化链接。

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


  • 管理持久化链接: HTTP/1.1默认链接是keep-alive持久链接,当服务器想明确断开链接,使用Connection: close

3.3 其余 通用首部字段

首部字段Date: 建立HTTP报文的日期和事件。

Pragma: 仅为兼容历史版本而存在。Pragma: no-cache

Trailer: 事先说明在报文主体后记录了哪些首部字段。 该首部字段可应用在 HTTP/1.1 版本分块传输编码时。


Transfer-Encoding: 规定传输报文主体时采用的编码方式。仅对分块传输编码有效。


Upgrade: 用于检测HTTP协议及其余协议是否可以使用更高的版本进行通讯。


Via: 在通过代理时附加该首部字段内容。追踪客户端与服务器以前的请求和响应报文的传输路径

  • 常常会和 TRACE 方法一块儿使用。如, 代理服务器接收到由 TRACE 方法发送过来的请求(其中Max-Forwards: 0) 时, 代理服务器就不能再转发该请求了。 这种状况下, 代理服务器会将自身的信息附加到 Via 首部后, 返回该请求的响应。


Warning: 告知用户一些与缓存相关的警告问题。

Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])

Warning: 113 gw.hackr.jo:8080 "something is expiration" Tue 03
复制代码


4. 请求首部字段

q:表示权重,范围0-1,值越大权重越高。Accept-xxx 均可以使用权重来控制。

首部字段 描述 详细参数
Accept "通知服务器,用户代理可以处理的媒体类型和媒体类型的相对优先级 type/subtype 格式" "文本类型:text/html ,text/plain,text/css,application/xhtm+xml,applciation/xml
图片文件:image/jpeg,image/gif,image/png
视频文件:video/mpeg,video/quicktime
应用程序使用的二进制文件:application/octet-stream,application/zip
Accept-Charset 通知服务器用户代理支持的字符集及字符集的相对优先顺序 Accept-Charset:iso-8895-5,unicode-1-1;
Accept-Encoding 告知服务器用户代理支持的内容编码及内容编码的优先级顺序 gzip: 由文件压缩程序gzip(GNU zip)生成的编码格式
compress: 由UNIX文件压缩程序compress生成的编码格式
deflate:组合使用 zlib 格式(RFC1950) 及由 deflate 压缩算法(RFC1951) 生成的编码格式
identity: 不执行压缩或不会变化的默认编码格式
Accept-Language 告知服务器用户代理可以处理的天然语言集(指中文或英文等),以及天然语言集的相对优先级 Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
Authorization 告知服务器, 用户代理的认证信息(证书值) GET /index.html
Ahtorization: Basic dWVub3NlbjpwYXNzd29yZA==
Expect 告知服务器, 指望出现的某种特定行为 HTTP/1.1 规范只定义了 100-continue(状态码 100 Continue 之意)
Form 告知服务器使用用户代理的用户的电子邮件地址。目的就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式 Form: aa@qq.com
Host 同一个IP 服务器部署这多个域名, 使用首部字段 Host 加以区分。 Host: www.hackr.jp
Max-Forwards 以十进制整数形式指定可通过服务器最大的数目
经过TRACE 或OPTION 方法,没通过一个服务器值减1
当值为0时再也不转发,直接返回响应
Max-Forwards:10
Proxy-Authorization 接收从代理服务器发来的认证查询时,
客户端会发送包含首部字段Proxy-Authorization 的请求,
以告知服务器认证所须要的信息
Proxy-Authorization: Basic dGlwOjkpNLAGfFY5
Range 对于只需获取部分资源的范围请求,
包含首部字段 Range 便可告知服务器资源的指定范围
Range: bytes=5001-10000
Referer 首部字段 Referer 会告知服务器请求的原始资源的 URI
TE 告知服务器,客户端可以处理响应的传输编码方式及相对优先级。
它和首部字段Accept-Encoding很像,可是用于传输编码
TE: gzip,deflate;q=0.5
User-Agent 用于传达浏览器的种类 User-Agent: Mozilla/5.0 (Window NT 6.1; wow64;rv:13.0)...

If-XXX

附带条件请求:形如If-xxx样式的请求首部字段成为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才回执行请求。

首部字段 描述 详细参数
If-Match 只有If-Match的字段值和ETag值匹配,服务器才接受请求 客户端请求:
Get /Index.html
If-Match:'123456'

服务器:
匹配资源所用的实体标记(ETag)值,一致执行请求返回资源,不然返回状态码412 Precondition Failed
If-Match:*,服务器会忽略ETag

若是须要获取到资源,则在返回状态码412后,还须要再次发起请求get /index.html,才能获取到新的资源
If-Modified-Since 指定日期时间后,资源费发生了更新,服务端会接收请求。
用来确认代理或客户端拥有的本地资源的有效性。
客户端请求:
Get /Index.html
If-Modified-Since:Thu,15 Apr 2012 00:00:00 GMT

服务端:
有修改返回:200 ok
Last-Modified: Sun,29 Aug 2012 00:00:12 GMT
无修改返回 304 Not Modified
If-None-Match 只有在 If-None-Match 的字段值与 ETag 值不一致时, 可处理该请求。
若是一致,就返回304,表示告知客户端使用本身本地的缓存。
在 GET 或 HEAD 方法中使用首部字段 If-None-Match 可获取最新的资源。
所以,这与使用首部字段 If-Modified-Since 时有些相似
客户端请求:
Get /Index.html
If-None-Match: '123456'

服务端:
ETag不一致:服务端处理,返回最新的数据
一致则返回304,客户端使用本身本地缓存
If-Range 告知服务器若指定的 IfRange 字段值(ETag 值或者时间)
和请求资源的ETag值或时间相一致时,则做为范围请求处理。
反之,则返回全体资源
客户端:
GET /index.html
If-Range:'123456'
Range: byte=5001-10000

服务端 ETag=123456:
206 Partial Content
Content-Range: bytes 5001-10000/10000
Content-Length:5000

服务器 ETag=567890:
200 OK
ETag: '567890'
If-Unmodified-Since 告知服务器,请求的资源在字段值指定的日期以后,未发生更新的请求才处理请求。
若是指定日期后发生了更新,则以状态码412 Preconditino Failed 响应
客户端:
Get /index.html
If-Unmodified-Since:Thu,15 Apr 2012 00:00:00 GMT

服务端时间内无修改:
200 ok

服务端时间内有修改:
412 Precondition Failed

5. 响应首部字段

首部字段 描述 详细参数
Accept-Ranges 告知客户端,服务器端是否可以处理范围请求,以指定获取服务器端某个部分的资源 Accept-Ranges:bytes/none (none表示不能处理)
Age 告诉客户端,源服务器在多久前建立了响应。单位
若建立该响应的服务器是缓存服务器, Age 值是指缓存后的响应再次发起认证到认证完成的时间值。
代理建立响应时必须加上首部字段Age。
Age:600
ETag 它是一种可将资源以字符串形式作惟一性标识的方式。服务器会为每份资源分配对应的 ETag 值。
当资源更新时,ETag 值也须要更新。生成 ETag 值时,并无 统一的算法规则,而仅仅是由服务器来分配

资源被缓存时,就会被分配惟一性标识。ETag 中有强 ETag 值和弱 ETag 值之分:
-强 ETag 值: 不论实体发生多么细微的变化都会改变其值。ETag: "usagi-1234"
-弱 ETag 值: 只用于提示资源是否相同。只有资源发生了根本改变,产 生差别时才会改变 ETag 值。这时,会在字段值最开始处附加 W/。ETag: W/"usagi-1234"
ETag: "usagi-1234"
Location 将响应接收方引导至某个与请求 URI 位置不一样的资源
通常配合3xx:Redirection,提供重定向URI,浏览器会强制性尝试访问重定向资源
Location: www.xxx.com
proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端 Proxy-Authenticate: Basic realm="Usagidesign Auth"
Retry-After 告诉客户端应该多久以后再次发起请求,配合状态码503 Service Unavailable3xx Redirect Retry-After:120(单位秒),Retry-After:Wed 04 Jul 2012 06:32:23 GMT
Server 告知客户端,当前服务器上安装的HTTP服务器应用程序的信息 Server: Apache/2.2.6 (Unix) PHP/5.2.5
WWW-Authenticate 用于 HTTP 访问认证。 它会告知客户端用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest) 和带参数提示的质询(challenge) 。 状态码 401 Unauthorized 响应中,确定带有首部字段 WWW-Authenticate
Vary 首部字段Vary可对缓存进行控制,源服务器 向 代理服务器传达关于本地返还使用方法的命令:
-代理服务器收到源服务器Vary:Accept-Language,若要进行缓存,则只缓存Accept-Language中可接受的语言的对应的文件进行缓存(en:则缓存英文)。
若是缓存服务器的缓存资源和Vary指定的首部字段不一样,则须要从新冲源服务器中获取
Vary: Accept-Language

6. 实体首部字段

首部字段 描述 详细参数
Allow 用于通知客户端可以支持 Request-URI 指定资源的全部 HTTP 方法 Allow: GET,HEAD
Content-Encoding 告知客户端服务器对实体的主体部分选用的内容编码方式 Content-Encoding: gzip
Content-Language 告诉客户端实体主体使用的天然语言 Content-Language:zh-CN
Content-Length 实体主体部分的大小。对实体主体进行内容编码传输时,不能再使用Content-Length Content-Length: 1500
Content-Location 给出与报文主体部分相对应的 URI。与首部字段Location不一样,表示的是报文主体返回资源对应的URI Content-Location:http:www.xx
Content-MD5 客户端会将接受到的主体实体执行相同的MD5算法,而后与首部字段Content-MD5字段值进行比较。
这种方式其实没法判断内容是否被篡改:由于主体实体被篡改,而Content-MD5也可能被篡改
Content-MD5:OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
Content-Range 针对范围请求时,经过Content-Range告诉客户端返回的实体的哪部分符合范围请求 Content-Range: bytes 5001-10000/10000
Content-Type 告知客户端实体主体内对象的媒体类型。
媒体类型和Accept同样,字段使用type-subtype形式赋值
参数charset:使用iso-8859-1 等字符集进行赋值
Content-Type: text/html;charset=UTF-8
Expires 告诉客户端,该资源的失效日期。
换存服务器接收到该首部,在过时以前一直会以缓存来应答请求。超过该日期,缓存服务器会转向源服务器获取请求资源
Exipires: Wed, 04 Jul 2012 08:26:05 GMT
Last-Modified 指明资源最终修改时间 Last-Modified: Wed, 23 May 2012 09:59:55 GMT

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

HTTP首部字段将定义缓存代理非缓存代理的行为。

逐跳首部(Hop-by-hop Header): 该类首部支队单次转发有效,会因经过缓存或代理而再也不转发。HTTP/1.1后若是要使用Hop-by-hop首部,需提供Connection首部字段。

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

端到端首部(End-to-end Header): 除上面的逐跳首部,都属于该类。分到该类的首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发

8. 非HTTP/1.1首部字段

Cookie:请求首部字段,服务器接收到的Cookie信息,一样能够以多个 Cookie 形式发送

set-Cookie: 开始状态管理所使用的Cookie信息,响应首部字段

Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31
复制代码
Set-Cookie属性 描述
expires 指定浏览器可发送Cookie的有效日期
当expires省略,有效期仅限于维持浏览器会话(Session)时间段内,一般用于浏览器关闭以前
path path 属性可用于限制指定 Cookie 的发送范围的文件目录
不过另有办法可避开这项限制, 看来对其做为安全机制的效果不能抱有期待
domain 指定的域名可作到与结尾匹配一致。
例如当指定example.com后,除了该域名,www.example.com 或www2.expample.com等均可以发送cookie
secure 限制 Web 页面仅在 HTTPS 安全链接时, 才能够发送 Cookie。当无该属性,不管是http,仍是https均可以回收该行为
例如:Set-Cookie: name=value; secure,仅当在https://www.example.com/(HTTPS) 安全链接的状况下才会进行 Cookie 的回收
HttpOnly 它使 JavaScript 脚本没法得到 Cookie。 其主要目的为防止跨站脚本攻击(Cross-sitescripting, XSS) 对 Cookie 的信息窃取
例如:Set-Cookie: name=zhaoxxx; HttpOnly,在Web页面能够对Cookie进行读取操做,可是使用javascript的document.cookie就没法读取。所以也就没法在 XSS 中利用 JavaScript 劫持Cookie 了

Content-Disposition: 指示服务器回复的内容该以何种形式展现,是之内联的形式(即网页或者页面的一部分),仍是以附件的形式下载并保存到本地。

9. 其余首部字段

首部字段 描述
X-Frame-Options(响应首部) 用于控制网站内容在其余 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking) 攻击。
DENY: 拒绝,SAMEORIGIN:仅同源域名下的页面容许显示加载,其余域名则不行
X-XSS-Protection(响应首部) 是针对跨站脚本攻击(XSS) 的一种对策, 用于控制浏览器 XSS 防御机制的开关
0:将XSS过来设置为无效状态,1:将XSS过滤设置成有效状态
DNT(请求首部) 其中DNT(Do Not Track),拒绝我的信息被收集,表示拒绝被精准广告追踪的一种方法
0: 赞成被追踪,1:拒绝被追踪
P3P(响应首部) P3P(The Platform forPrivacy Preferences, 在线隐私偏好平台) 技术,可让 Web 网站上的我的隐私变成一种仅供程序可理解的形式, 以达到保护用户隐私的目的。P3P设定步骤: 1:建立P3P隐私2: 建立P3P隐私对照文件后,保存命名在/w3c/p3p.xml3:从P3P隐私中新建Compact plicies后,输出到HTTP响应中
相关文章
相关标签/搜索