1. HTTP 报文
HTTP报文 = 报文首部 + '空行(CR+LF)' + 报文主体
复制代码
2. HTTP首部字段类型
HTTP首部字段是构成HTTP报文的要素之一。在客户端和服务器端以HTTP协议进行通信的过程中,无论是请求还是响应:都会使用首部字段,它能起到传递额外重要信息的作用。
- 通用首部字段(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 : 表明其他用户可以利用缓存
private: 表明只能特定用户
作为对象(与public相反)。缓存服务器会对特定用户提供缓存的服务,对于其他用户发过来的请求,代理服务器不会返回缓存。
no-cache:从字面意义上很容易误解为不缓存,但是no-cache代表不缓存过期的资源,缓存会向服务器进行有效处理确认之后处理资源
- 客户端请求包含
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(单位秒):缓存的资源即使过期
了也照常接收。
- 未指定参数,无论过多久,客户端都会响应
- 指定具体值,那么即使过期,但人处于
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 Unavailable 或3xx 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.xml 3:从P3P隐私中新建Compact plicies后,输出到HTTP响应中 |