常見的HTTP Header
文件信息:
Content-Type: application/x-javascript Content-Length: 2000
Content-Type:指定請求和響應的內容類型,如果未指定即為text/html
常用的Content-Type
text/plain:普通文本
tex/html:html文本
application/x-javascript:js
application/x-www-form-urlencoded:默認形式表單發包類型
multipart/form-data:用在發送文件的post包中
application/json:通過json傳輸
application/xml:通過xml傳輸
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
編碼方式
- gzip 表明實體采用GNU zip編碼
- compress 表明實體采用Unix的文件壓縮程序
- deflate 表明實體是用zlib的格式壓縮的
- identity 表明沒有對實體進行編碼。當沒有Content-Encoding header時, 就默認為這種情況
壓縮流程:
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
常見的HTTP Header