HTTP报文 = 报文首部 + '空行(CR+LF)' + 报文主体
复制代码
HTTP首部字段是构成HTTP报文的要素之一。在客户端和服务器端以HTTP协议进行通讯的过程当中,不管是请求仍是响应:都会使用首部字段,它能起到传递额外重要信息的做用。
javascript
// 操做缓存的工做机制。参数使用`,`分割
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"
复制代码
Connection 首部: 控制再也不转发给代理
的首部字段 和 管理持久化链接。
keep-alive
持久链接,当服务器想明确断开链接,使用Connection: close
首部字段Date: 建立HTTP报文的日期和事件。
Pragma: 仅为兼容历史版本而存在。Pragma: no-cache
Trailer: 事先说明在报文主体后
记录了哪些首部字段
。 该首部字段可应用在 HTTP/1.1 版本分块传输编码时。
Transfer-Encoding: 规定传输报文主体
时采用的编码方式
。仅对分块传输
编码有效。
Upgrade: 用于检测HTTP协议及其余协议是否可以使用更高的版本进行通讯。
Warning: 告知用户一些与缓存相关的警告问题。
Warning: [警告码][警告的主机:端口号]“[警告内容]”([日期时间])
Warning: 113 gw.hackr.jo:8080 "something is expiration" Tue 03
复制代码
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-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 |
首部字段 | 描述 | 详细参数 |
---|---|---|
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 |
首部字段 | 描述 | 详细参数 |
---|---|---|
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 |
HTTP首部字段将定义缓存代理
和非缓存代理
的行为。
逐跳首部(Hop-by-hop Header)
: 该类首部支队单次转发有效,会因经过缓存或代理而再也不转发。HTTP/1.1后若是要使用Hop-by-hop
首部,需提供Connection首部字段。
端到端首部(End-to-end Header)
: 除上面的逐跳首部
,都属于该类。分到该类的首部会转发给请求
/ 响应对应的最终接收目标
,且必须保存
在由缓存生成的响应中
,另外规定它必须被转发
。
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: 指示服务器回复的内容该以何种形式展现,是之内联的形式(即网页或者页面的一部分),仍是以附件的形式下载并保存到本地。
首部字段 | 描述 |
---|---|
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响应中 |