本文是本系列的第三篇,主要记录了HTTP报文首部的相关知识,如果有错误烦请大家指出。
1.HTTP报文首部
HTTP协议的请求和响应报文中必包含HTTP首部,首部内容为客户端和服务器分别处理响应和请求提供所需要的信息,但对于用户来说,这些信息中的大部分都无需查看。报文首部由几个字段构成:
2.HTTP首部字段
HTTP首部字段是构成HTTP报文的要素之一,在客户端与服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段来传递额外信息。HTTP首部字段是由首部字段名和字段值构成的,中间由冒号":"分隔。
首部字段名:字段值[,字段值](单个HTTP首部字段可以有多个值,以逗号","分隔)
HTTP首部字段根据实际用途被分为以下4种类型:
3.HTTP/1.1通用首部字段
通用首部字段是指请求报文和响应报文双方都会使用的首部字段。
Cache-Control
通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
指令的参数是可选的,多个指令之间通过逗号(,)分隔。
Cache-Control: private, max-age=0, no-cache
表示是否能缓存的指令:
控制可执行缓存对象的指令:
指定缓存期限和认证的指令:
max-age指令:当客户端发送的请求中包含max-age指令时,如果判定缓存资源的时间比指定的时间小,那么客户端就接收缓存的资源。max-age指令的优先级高于缓存有效性检查。
s-maxage指令:s-maxage指令的功能和max-age相同,只是s-maxage指令只适用于供多位用户使用的公共缓存服务器。
Cache-Control: max-age=604800
min-fresh指令:min-fresh指令要求缓存服务器返回至少还未过指定时间的缓存资源。比如当指定min-fresh为60秒,现在时刻有效但在60内失效的缓存将不被返回。
max-stale指令:使用max-stale指令可知识缓存资源即使过期,只要过期时间在max-stale指定的时间之内也将照常接受。
only-if-cached指令:使用该指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回,若请求服务器的本地缓存无响应,则返回状态吗504 Gateway Timeout。
must-revalidate指令:使用must-revalidate指令代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。使用该指令会忽略max-stale指令。
proxy-revalidate指令:使用proxy-revalidate指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,再次验证缓存的有效性。
no-transform指令:使用no-transform指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型,这样做可以防止缓存或代理压缩图片等类似操作。
Connection
Connection首部字段具有两个功能:控制不再转发给代理的首部字段、管理持久连接。
Date
首部字段Date表明创建HTTP报文的日期和时间。
Date: Tue Jul 03 04:40:59 2012
Trailer
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段。
Trailer: Expires
···报文主体···
0
Expires: Tue, 28 Sep 2004 23:59:59 GMT
该例子中Trailer字段的值为Expires,在报文主体之后(分块长度0之后)出现了首部字段Expires。
Transfer-Encoding
首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。
Upgrade
首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数可以用来指定一个完全不同的通信协议。
Via
首部字段Via是为了追踪客户端和服务器之间的请求和响应报文的传输路径。报文经过代理或网关时,会现在首部字段Via中附加该服务器的信息然后再进行转发。
Warning
该首部通常会告知用户一些与缓存相关问题的警告。Warning首部的格式如下:
Warning: [警告码][警告的主机:端口号]"[警告内容]"([日期时间])
如:Warning: 113 gw.hackr.jp:8080 “Heuristic expiration” Tue, 03 Jul 2012 05:09:44 GMT
4.HTTP请求首部字段
请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对相应内容相关的优先级等内容。
如果想要给媒体类型增加优先级,则使用q=来额外表示权重,用分号(;)与媒体类型进行分隔,取值范围是0~1,默认权重是1。当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
Accept-Charset
Accept-Charset首部字段可用来溶质服务器用户代理支持的字符集及字符集的优先顺序。权重模式同上。
Accept-Encoding
Accept-Encoding首部字段告诉服务器用户代理支持的内容编码及内容编码的优先级顺序。如:
Accept-Language
首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集及其相对优先级。
Authorization
首部字段Authorization是用来告诉服务器用户代理的认证信息。通常,想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中。
Expect
首部字段Expect告知服务器期望出现的某种特定行为,因服务器无法理解客户端的期望做出回应而发生错误时,会返回状态码417 Expection Failed。
From
首部字段From用来告诉服务器使用用户代理的电子邮箱地址。通常,其目的就是为了显示搜索引擎等用户代理的负责人的电子邮箱。
Host
首部字段Host会告诉服务器请求的资源所处的互联网主机名和端口号,是HTTP/1.1唯一一个必须被包含在请求中的首部字段。主要是用来解决多个虚拟主机的问题,使用Host明确指出请求的主机名。
If-Match
形如If-xxx这种样式的请求首部字段称为条件请求。服务器收到附带条件的请求后只有判断指定条件为真时才会执行请求。
首部字段If-Match会告知服务器匹配资源所用的实体标记(ETag),服务器会对比If-Match的字段值和ETag,当二者一致时才执行请求,否则返回412 Precondition Failed的响应。
If-Modified-Since
首部字段If-Modified-Since会告知服务器如果If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。反之返回状态吗304 Not Modified的响应。该字段用于确认代理或客户端拥有的本地资源的有效性。
If-None-Match
首部字段If-None-Match和首部字段If-Match作用相反。用于指定If-None-Match字段值的实体标记(ETag)与请求资源的ETag不一样时,告知服务器处理该请求。用于对比缓存。
If-Unmodified-Since
首部字段If-Unmodified-Since和首部字段If-Modified-Since作用相反,他的作用是告知服务器指定请求的资源只有在字段内指定的时期之后未发生更新的情况下才能处理请求。否则以状态码412 Precondition Failed作为响应返回。
Max-Forwards
通过TRACE方法或OPTIONS方法发送包含首部字段Max-Forwards的请求时,该字段以十进制证书形式指定可经过的服务器最大数目。服务器在往下一个服务器转发请求之前,会将Max-Forwards的值减一。当服务器接收到Max-Forwards值为零的请求时,则不再进行转发而是返回响应。
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需的信息。
Range
对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。
Referer
首部字段Referer会告知服务器请求的原始资源的URI,也就是说只要查看URI就能知道请求的URI是从哪个Web页面发起的。
TE
首部字段TE会告知服务器客户端能够处理响应的传输编码方式及相对优先级。
User-Agent
首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。
5.HTTP响应首部字段
响应首部字段是由服务器向客户端返回响应报文中所使用的的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
Accept-Range
首部字段Accept-Range是用来告诉客户端服务器是否能处理范围请求。可指定的字段值有两种none和bytes,分别代表不能处理和可以处理。
Age
首部字段Age能告诉客户端源服务器在多久前创建了响应(单位为秒),若创建响应的是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间。
ETag
首部字段ETag能告诉客户端实体标识,它是一种可以将资源以字符串的形式做唯一标识的方式。服务器会为每份资源分配对应的ETag值,当资源更新时,ETag也需要更新。
Location
使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3xx Redrection的响应,提供重定向的URI。
Proxy-Authenticate
首部字段Proxy-Authenticate用于代理服务器的访问认证,他会告诉客户端用于访问请求URI所指定资源的认证方案。
Retry-After
首部字段Retry-After告知客户端应该在多久之后再次发送请求(单位秒),可以配合状态码503 Service Unavailable和3xx Rediction响应一起使用。另外,字段值可以指定为具体的日期时间。
Server
首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息,不单单会标出服务器上的软件应用名称,还有可能包括版本号和安装时启动的可选项。
Server: Apache/2.2.6 (Unix) PHP/5.2.5
Vary
首部字段Vary可以对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令。从代理服务器接收到源服务器返回包含Vary指定项的响应之后,若再要进行缓存,仅对请求中含有Vary指定首部字段的请求返回缓存。
WWW-Authenticate
首部字段WWW-Authenticate用于HTTP访问认证,他会告诉客户端用于访问请求URI所指定资源的认证方案。状态码401 Unauthorized响应中一定带有首部字段WWW-Authenticate。
6.HTTP实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的的首部,用于补充内容更新时间等与实体有关的信息。
Allow
首部字段Allow用于通知客户端能够支持的Request-URI指定资源的所有HTTP方法。当服务器接收到不支持的HTTP方法时,会以状态码405 Methord Not Allowed作为响应返回,并把所有能支持的HTTP方法写入首部字段Allow后返回。
Content-Encoding
首部字段Content-Encoding会告诉客户端服务器对实体的主体部分选用的内容编码方式,主要采用此种内容编码方式:gzip、compress、deflate、identity。
Content-Language
首部字段Content-Language会告诉客户端实体主体使用的自然语言。
Content-Length
首部字段Content-Length表明了实体主体部分的大小(单位是字节)。对实体的主体内容进行编码传输时,不能再使用该首部。
Content-Location
首部字段Content-Location给出与报文主体部分相对应的URI,通常情况下是Request中请求的URI。
Content-MD5
首部字段Content-MD5是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
Content-Range
针对范围请求,返回响应中使用首部字段Content-Range,用来告诉客户端作为响应返回的实体的哪个部分符合范围请求(单位是字节),表示当前发送部分以及整个实体大小。
Content-Type
首部字段Content-Type说明了实体主体内对象的媒体类型。
Content-Type: text/html; charset=UTF-8
Expires
首部字段Expires会将资源失效的日期告诉客户端,缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段指定的时间到达之前,响应的副本会一直被保存。
但是,当首部字段Cache-Control指定max-age时,会优先处理max-age指令。
7.为Cookie服务的首部字段
管理服务器与客户端之间状态的Cookie虽然没有被编入标准化HTTP/1.1的RFC2616中,但在Web中有广泛应用。Cookie的工作任务是用户识别和状态管理。Web网站为了管理用户状态,会通过Web浏览器把一些数据临时写入用户的计算机内,当用户访问该网站时,可通过通信方式取回之前存放的Cookie以确认用户身份和状态。
常见的为Cookie服务的首部字段有两个:
字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的的Cookie信息 | 响应首部字段 |
Cookie | 服务器接受到的Cookie信息 | 请求首部字段 |
Set-Cookie
Set-Cookie是服务器用来告知客户端状态管理的各种信息的,有如下几个字段值:
属性 | 说明 |
---|---|
NAME=VALUE | 赋予Cookie的名称和值 |
expires=DATE | Cookie的有效期(如果不指定就是以浏览器关闭为止) |
path=PATH | 将服务器上的文件目录作为Cookie的适用对象 |
domain=域名 | Cookie适用对象的域名 |
Secure | 仅在HTTPS安全通信时才会发送Cookie |
HttpOnly | 使Cookie不能被Javascript脚本访问 |
expires属性
指定浏览器发送Cookie的有效期,当省略expires时有效期仅限于维持浏览器会话时间段内。另外,一旦Cookie发送到客户端,服务端就不存在可以显示删除Cookie的方法,但可以通过对已过期的Cookie进行覆盖实施删除。
path属性
用于限制指定Cookie的发送范围的文件目录,表示该Cookie仅在path目录使用。
例如:为www.xxx.com设置Cookie,Set-Cookie: id=“123”;domain=“www.xxx.com”;
然后再为 www.xxx.com/1/ 设置Cookie,Set-Cookie: name=“456”;domain=“www.xxx.com”;path=/1/;
这时,访问www.xxx.com时首部附带的是Cookie:id=“123”;
而访问 www.xxx.com/1/ 时首部附带的是Cookie:id=“123”;name=“456”;
domain属性
通过Cookie的domain属性指定的域名可做到与结尾匹配一致,比如设置example.com
后,访问www.example.com和www2.example.com都会附带Cookie。因此,除了针对具体指定的多个域名发送Cookie之外,不指定domain显得更安全。
Secure属性
Cookie的Secure属性用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie。
Set-Cookie: name=value;secure
HttpOnly属性
Cookie的HttpOnly属性是Cookie的扩展功能,它使JavaScript脚本无法获得Cookie,Cookie只用于HTTP通信,它可以防止跨站脚本攻击(XSS)对Cookie信息的窃取。但该扩展并不是为了防止XSS而开发的。
Cookie
首部字段Cookie会告诉服务器,当客户端想获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。
Cookie:status=value
例如:Cookie:uid=123456
本系列的下一篇将带来HTTPS和用户身份认证的相关内容。