文件信息:javascript
Content-Type: application/x-javascript Content-Length: 2000
Content-Type:指定请求和响应的内容类型,若是未指定即为text/htmlhtml
经常使用的Content-Typejava
text/plain:普通文本json
tex/html:html文本浏览器
application/x-javascript:js缓存
application/x-www-form-urlencoded:默认形式表单发包类型服务器
multipart/form-data:用在发送文件的post包中网络
application/json:经过json传输app
application/xml:经过xml传输ide
Content-Length:用于指定请求或相应的内容长度
1.若是存在Transfer-Encoding(chuncked)则在头信息中不能有Content-Type有也会被忽略
2.若是是短链接则能够经过关闭链接来肯定长度
3.Content-Length必须与传输内容长度相同,过长会致使超时,太短会直接截断
4.http1.1以前不支持keep-alive,Content-Length无关紧要。http1.1若为keep-alive则chuncked和Content-Length必须二选一,若为非keep-alive则Content-Length无关紧要
压缩:
Accept-Encoding: gzip
Content-Encoding: gzip
编码方式
压缩流程:
1.浏览器在发送请求时会带上Accept-Encoding头信息,里面有浏览器支持的全部压缩方式。
2.服务器在接收到浏览器发过来的信息以后,对Accept-Encoding里面的信息进行判断,选择合适的压缩方式对相应内容进行压缩,而后增长Content-Encoding头信息,将其改成当前使用的压缩方式名,将响应发回浏览器。
3.浏览器接收到响应后,经过对Content-Encoding中的信息进行判断,选择合适的解压方式进行解压,并展现
代理缓存:
Vary: Accept-Encoding
代理缓存,从服务器到浏览器可能通过多个中间体,如:缓存服务器。如今不少应用都用到了缓存机制,而一个url可能会返回多个文档,中间服务器应该缓存哪些,浏览器请求时应该返回哪些文档,这就涉及到浏览器和服务器之间的一个内容协商问题。
通常有两种方式:
1)服务器每次都返回多个版本,300(Mutiple choices),让浏览器本身选择,可是这种会致使多一次网络请求,还有就是某些版本的文档是给具备特殊功能(好比压缩)的浏览器准备的,让普通用户选可能会出现问题
2)服务器根据浏览器发送的Accept字段来选择合适的内容发送
请求字段 | 字段说明 | 响应头字段 |
Accept | 告知服务器接收哪一种媒体类型 | Content-Type |
Accept-Encoding | 告知服务器接收哪一种压缩形式 | Content-Encoding |
Accept-Language | 告知服务器接受哪一种语言 | Content-Language |
Accept-Charset | 告知服务器接收哪一种编码方式 | Content-Type |
有时候这四个字段不够用会用User-Agent和Cookie一块判断,这时候就须要加一个
Vary: User-Agent, Cookie
通常来讲只须要在Vary中写除了Accept-*以外的字段,可是存在一些服务器对这个机制实现有Bug,它们会直接忽略响应头中的Content-Encoding,从而可能会给不支持压缩的浏览器发回压缩后的文档,因此若是有压缩的话,须要给响应头中增长Accept-Encoding使得Bug服务器可以正确的缓存。
缓存:
Expires: Mon, 24 Feb 2014 03:34:00 GMT Cache-Control: max-age=3600 If-None-Match: "b3234c-9999-45334a15" Etag: "b3234c-9999-45334a15" If-Modified-Since: Mon, 24 Feb 2014 03:34:00 GMT Last-Modified: Mon, 24 Feb 2014 03:34:00 GMT
Expires:过时时间,这个属性告诉缓存方,相关副本在多长时间内是可用的,当超过这个时间,缓存方就会向服务器发送请求从新获取
注意点: 1.时间格式必须为GMT时间格式,其余时间格式,其他的时间格式都会被当成以前的时间
2.缓存方时间必须和服务器时间一致,否则会致使提早或延迟更新
Cache-Control:缓存控制
经常使用的有如下几种属性值
max-age:指示在多少秒以内,缓存方不用向服务器发送这个文件的请求,直接使用缓存。在max-age时间以内,浏览器请求该文件的响应老是为200(from cache)
no-cache:强制缓存方必须每次都向服务器发送请求,由服务器决定缓存方保存的是否为最新的文件。若是为最新的,服务器就会返回304(Not Modified),缓存方直接使用缓存;若是不是最新返回200,并返回最新的文件。通常配合last-modified或Etag一块儿使用。
no-store:强制缓存方永远不缓存该文件,每次都是向服务器请求最新的文件
public:表示任何缓存方均可缓存该响应
private:只会缓存给该用户不会共享缓存
Etag/If-None-Match:
1)缓存方第一次请求时,服务器返回的响应头中会包含一个Etag的hash
2)以后每次缓存方向服务器请求时都会包含一个If-None-Match头信息,内容为服务器返回的Etag,而后服务器对这个头信息进行判断,若是为最新的,服务器就会返回304(Not Modified),缓存方直接使用缓存;若是不是最新返回200,并返回最新的文件,更新Etag字段。
Last-Modified/If-Modified-Since:
1)缓存方第一次请求时,服务器返回的响应头中会包含一个Last-Modified头信息,内容为该文件的最后更新时间
2)以后每次缓存方向服务器请求时都会包含一个If-Modified-Since头信息,内容为服务器返回的Last-Modified,而后服务器对这个头信息进行判断,若是为最新的,服务器就会返回304(Not Modified),缓存方直接使用缓存;若是不是最新返回200,并返回最新的文件,更新Last-Modified字段。
总结:Expires和Cache-Control为缓存方判断是直接读取缓存仍是向服务端发请求的字段,只不过Cache-Control比Expires控制的要多一点
Etag/If-None-Match和Last-Modified/If-Modified-Since为服务器判断缓存方保存的是否为最新的,若是为最新就返回304让缓存方使用缓存,若是不是最新则返回最新内容。不过前者是经过随机字符串判断,后者是经过时间判断
长链接:
connection: keep-alive
Keep-Alive: timeout=20, max=2
将connection设置为keep-alive可让多个链接共用一个TCP链接,提升了交互效率
Keep-Alive用来设置该链接的过时时间,上例中20秒后或者在该链接中请求了两次后断开
connection可为请求或者响应头,Keep-Alive仅为响应头。
重定向:
Location: http://www.baidu.com