HTTP(HyperTextTransferProtocol)是超文本傳輸協議的縮寫,它用於傳送WWW方式的數據,關於HTTP協議的詳細內容請參考RFC2616
。HTTP協議采用了請求、相應模型。客戶端向服務器發送一個請求,請求頭包含請求的方法、URI、協議版本、以及包含請求修飾符、客戶信息
和內容。服務器以一個狀態行作為響應,相應的內容包括消息協議的版本,成功或者錯誤編碼加上包含的服務器信息、實體元信息以及可能的
實體內容。
下面以一個例子來解釋HTTP應答頭中各項的意義:
1.Google提供的HTTP服務應答頭中各項的意義
HTTP/1.1 200 OK
Date: Thu, 10 Dec 2009 07:05:24 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/Html; charset=ISO-8859-1
Set-CookIE: PREF=ID=953749d231aac991:NW=1:TM=1260428724:LM=1260428724:S=SVO8GYM45lSw23HR; expires=Sat, 10-Dec-2011 07:05
:24 GMT; path=/; domain=.google.com
Set-CookIE: NID=29=jKOWKRrA8bkt3pZGQMD9YWpUviUid2XJ-e9ja4X4gCHs7aS9xpSkEGaOVSiXcxH0I-0qroLXOhkrn7_kygkXzqMwq3llEen9UsdNk
uFTProfDO2i4FoMvSuJBJTPrXZv; expires=Fri, 11-Jun-2010 07:05:24 GMT; path=/; domain=.google.com; HttpOnly
Server: gws
X-XSS-Protection: 0
Transfer-Encoding: chunked
下面來逐行解釋:
1.HTTP/1.0 200 OK
響應消息的第一行為下面的格式:
HTTP-Version表示支持的HTTP版本,例如HTTP/1.1。後面的是一個三個數字的結果代碼。第一個數字可能取5個不同的值:
1xx:信息響應類,表示接收到請求並且繼續處理
2xx:處理成功響應類,表示動作被成功接收、理解和接受
3xx:重定向響應類,為了完成指定的動作,必須接收進一步處理
4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行
5xx:服務器端錯誤,服務器不能正確執行一個正確的請求
2.Date: Thu, 10 Dec 2009 07:05:24 GMT
Date頭域表示消息發送的時間,所給的時間是格林威治時間,時間的描述格式有RFC822定義,如想換算成本地時間,需要知道用戶所在的時區
。
3.Expires: -1
指明應該在什麼時候認為文檔已經過期,從而不再緩存它?該數字是一個過期的時間,0表示立即過期,-1也是一樣的道理,負多少都一樣。
在沒有過期之前,代理可直接從緩存中返回以前的響應結果。
4.Cache-Control: private, max-age=0
Cache-Control指定請求和響應遵循的緩存機制,在請求消息或響應消息中設置Cache-Control並不會修改另一個消息處理過程中的緩存處理過
程。private指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述用戶的部分響應消息,此響應消息對於其
他用戶的請求無效
public指示響應可被任何緩存區緩存
max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
如果max-age = 3600 ,就是告訴客戶端該請求的響應結果在多長時間內有效,在有效期內,當用戶再次需要訪問時,直接從客戶端本地讀取,
不需要訪問服務器。
5.Content-Type: text/Html; charset=ISO-8859-1
Content-Type實體頭用於向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型。表示後面的文檔屬於什麼MIME類型(MIME
類型就是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,浏覽器會自動使用指定應用程序來打開。
多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式)。Servlet默認為text/plain,但通常需要顯示地指定為text/Html。
Charset為指定文字的編碼方式,就是返回頁面的編碼方式,不同的語言文字的編碼方式不同,比如台灣就是big5(大五碼)。
6.Set-CookIE: PREF=ID=953749d231aac991:NW=1:TM=1260428724:LM=1260428724:S=SVO8GYM45lSw23HR; expires=Sat, 10-Dec-2011 07:05:24
GMT; path=/; domain=.google.com
服務器設置客戶端Cookie。下面講解一下CookIE的格式及組成:
Cookie由變量名和值組成。其屬性裡既有標准的CookIE變量,也有用戶自己創建的變量,屬性變量是用“變量=值”形式來保存。格式如下:
Set-Cookie:NAME=VALUE;ExprIEs=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
NAME=VALUE:
這是每一個Cookie均必須有的部分。NAME是該Cookie的名稱,VALUE是該CookIE的值,在字符串“NAME=VALUE”中,不含分號,逗號和空格等字
符。
Expires=DATE:
Expires變量是一個只寫變量,它確定了CookIE有效終止日期。該屬性值DATE必須以特定的格式來書寫:星期幾,DD-MM-YY HH:MM:SS GMT,GMT
表示這是格林尼治時間。反之,不以這樣的格式來書寫,系統將無法識別。該變量可省,如果缺省時,則CookIE的屬性值不會保存在用戶的硬
盤中,而僅僅保存在內存當中,CookIE文件將隨著浏覽器的關閉而自動消失。
Domain=DOMAIN-NAME:
Domain該變量是一個只寫變量,它確定了哪些internet域中的web服務器可讀取浏覽器所存取的CookIE,即只有來自這個域的頁面才可以使用
Cookie中的信息。這項設置是可選的,如果缺省時,設置CookIE的屬性值為該web服務器的域名。
Path=PATH:
Path屬性定義了Web服務器上哪些路徑下的頁面可獲取服務器設置的CookIE。一般如果用戶輸入的URL中的路徑部分從第一個字符開始包含Path
屬性所定義的字符串,浏覽器就認為通過檢查,如果Path屬性的值為“/”,則web服務器上所有的WWW資源均可讀取該CookIE。同樣該設置是可
選的,如果缺省時,則Path的屬性值為Web服務器傳給浏覽器的資源的路徑名。
可以看出我們借助對Domain和Path兩個變量的設置,即可有效地控制CookIE文件被訪問的范圍。
Secure:
在CookIE中標記該變量,表明只有當浏覽器和Web Server之間的通信協議為加密認證協議時,浏覽器才向服務器提交相應的CookIE。當前這種
協議只有一種,即為HTTPS
7.Server: gws
所請求的web服務器,WEB 服務器表明自己是什麼軟件及版本等信息。。gws即是:google web server。
8.X-XSS-Protection: 0
隨著網絡欺詐、惡意軟件和跨站點腳本(XSS)攻擊的急劇增加,浏覽器廠商開始重新設計其安全功能。最新版本的眾多浏覽器都包含了一些微
妙改進,以進一步增強其安全性。尤其是IE8包括了幾個重要的變化,這些變化需要開發人員和管理員在利用這些安全特性之前有足夠的了解。
1. IE8采取的跨站點腳本
為了幫助遏制日益猖獗的跨站點腳本攻擊,
微軟為IE8增加了一個過濾器,XSS安全漏洞中,最常見的一類稱為“反射類”,或“類型1”的XSS安全漏洞。IE8中的XSS過濾器就是為了保護
普通用戶即使在訪問的網站存在XSS安全漏洞的情況下,也能避免類型1的XSS攻擊。XSS過濾器可以監控浏覽器的HTTP請求和響應。如果發現了
可疑的XSS攻擊腳本,它就會提示用戶,並且自動將惡意的腳本過濾為普通的文本信息顯示在頁面上。
需要強調的是,XSS過濾器的目的是為了阻止最為常見的XSS攻擊。它並不能阻止所有類型的XSS攻擊,更不意味著web開發人員從此就不需要關
注其網站是否存在XSS安全漏洞了。基於兼容性的考慮,如果網站的開發人員希望XSS過濾器不對其網站內容檢查的話,可以設置一下HTTP頭信
息:X-XSS-Protection:0
9.Transfer-Encoding: chunked
當不能預先確定報文體的長度時,不可能在頭中包含Content-Length域來指明報文體長度,此時就需要通過Transfer-Encoding域來確定報文體
長度。
通常情況下,Transfer-Encoding域的值應當為chunked,表明采用chunked編碼方式來進行報文體的傳輸。chunked編碼是HTTP/1.1 RFC裡定
義的一種編碼方式,因此所有的HTTP/1.1應用都應當支持此方式。
還有一些會經常遇到
10.Last-ModifIEd: Thu, 10 Dec 2009 05:39:55 GMT
1) 什麼是”Last-ModifIEd”?
在浏覽器第一次請求某一個URL時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個Last-ModifIEd的屬性標記此文件在服
務期端最後被修改的時間,格式類似這樣:
Last-ModifIEd: Fri, 12 May 2006 18:53:33 GMT
客戶端第二次請求此URL時,根據 HTTP 協議的規定,浏覽器會向服務器傳送 If-ModifIEd-Since 報頭,詢問該時間之後文件是否有被修
改過:
If-ModifIEd-Since: Fri, 12 May 2006 18:53:33 GMT
如果服務器端的資源沒有變化,則自動返回 HTTP 304 (Not Changed.)狀態碼,內容為空,這樣就節省了傳輸數據量。當服務器端代碼
發生改變或者重啟服務器時,則重新發出資源,返回和第一次請求時類似。從而 保證不向客戶端重復發出資源,也保證當服務器有變化時,客
戶端能夠得到最新的資源。
2) 什麼是”Etag”?
HTTP 協議規格說明定義ETag為“被請求變量的實體值” (參見 —— 章節 14.19)。 另一種說法是,ETag是一個可以與Web資源關聯的
記號(token)。典型的Web資源可以一個Web頁,但也可能是JSON或XML文檔。服務器單 獨負責判斷記號是什麼及其含義,並在HTTP響應頭中將
其傳送到客戶端,以下是服務器端返回的格式:
ETag: "50b1c1d4f775c61:df3"
客戶端的查詢更新格式是這樣的:
If-None-Match: W/"50b1c1d4f775c61:df3"
如果ETag沒改變,則返回狀態304然後不返回,這也和Last-ModifIEd一樣。本人測試Etag主要在斷點下載時比較有用。
Last-ModifIEd和Etags如何幫助提高性能?
聰明的開發者會把Last-ModifIEd 和ETags請求的http報頭一起使用,這樣可利用客戶端(例如浏覽器)的緩存。因為服務器首先產生
Last-ModifIEd/Etag標記,服務器可在稍後使用它來判斷頁面是否已經被修改。本質上,客戶端通過將該記號傳回服務器要求服務器驗證其(
客 戶端)緩存。
過程如下:
1. 客戶端請求一個頁面(A)。
2. 服務器返回頁面A,並在給A加上一個Last-ModifIEd/ETag。
3. 客戶端展現該頁面,並將頁面連同Last-ModifIEd/ETag一起緩存。
4. 客戶再次請求頁面A,並將上次請求時服務器返回的Last-ModifIEd/ETag一起傳遞給服務器。
5. 服務器檢查該Last-ModifIEd或ETag,並判斷出該頁面自上次客戶端請求之後還未被修改,直接返回響應304和一個空的響應體。
11.Age: 59
當代理服務器用自己緩存的實體去響應請求時,用該頭部表明該實體從產生
到現在經過多長時間了。
12. Content-Length: 401021
Content-Length:WEB 服務器告訴浏覽器自己響應的對象的長度。後為傳送的字節數,即內容長度。只有當浏覽器使用持久HTTP連接
時才需要這個數據。
13. Accept-Ranges: bytes
WEB服務器表明自己是否接受獲取其某個實體的一部分(比如文件的一部分)的請求。
bytes:表示接受,none:表示不接受。
14.Vary: Accept-Encoding
WEB服務器用該頭部的內容告訴 Cache 服務器,在什麼條件下才能用本響應所返回的對象響應後續的請求。
假如源WEB服務器在接到第一個請求消息時,其響應消息的頭部為:Content-Encoding: gzip; Vary: Content-Encoding
那麼 Cache 服務器會分析後續請求消息的頭部,檢查其 Accept-Encoding,是否跟先前響應的 Vary 頭部值一致,即是否使用
相同的內容編碼方法,這樣就可以防止 Cache 服務器用自己 Cache 裡面壓縮後的實體響應給不具備解壓能力的浏覽器。
例如:Vary:Accept-Encoding
15.Connection: close
請求:close(告訴WEB服務器或者代理服務器,在完成本次請求的響應後,斷開連接,不要等待本次連接的後續請求了)。
keepalive(告訴WEB服務器或者代理服務器,在完成本次請求的響應後,保持連接,等待本次連接的後續請求)。
響應:close(連接已經關閉)。
keepalive(連接保持著,在等待本次連接的後續請求)。
Keep-Alive:如果浏覽器請求保持連接,則該頭部表明希望 WEB 服務器保持連接多長時間(秒)。
例如:Keep-Alive:300
16.X-Cache: HIT from xd33-88.HP08040027.sina.com.cn
反向代理服務器使用的 HTTP 頭部
18.X-UA-Compatible: IE=EmulateIE7、
上面標簽中的X-UA-Compatible, 是針對ie8新加的一個設置,對於IE8之外的浏覽器是不識別的,這個區別與content=”IE=7″在無論頁面是
否包含<!DOCTYPE>指令,都像是使用了 Windows Internet Explorer 7的標准模式。而content=”IE=EmulateIE7″模式遵循<!DOCTYPE>指令。
對於多數網站來說,它是首選的兼容性模 式。
目前IE8尚在測試版中,所以為了避免制作出的頁面在IE8下面出現錯誤,建議直接將IE8使用IE7進行渲染。