前些天因爲一些編程須要,接觸到了HTTPheader的有關知識,因而就本着學習的目的索性把這個東西弄個明白。今天在這裏總結一下,但願能幫助到一些有這方面知識要求的同窗,也方便本身在之後的學習中做參考。因爲我也是第一次接觸到這個東西,若是有什麼錯誤的理解和表述但願你們能夠熱心的及時提出來,以避免誤導了更多看到這篇文章的人,也方便我本身及時更正本身的錯誤。web
下面入正題。編程
WHAT IS HTTP瀏覽器
HTTP是「Hypertext Transfer Protocol」的縮寫,是一個應用層協議,整個萬維網都在使用這種協議,幾乎你在瀏覽器裏看到的大部份內容都是經過http協議來傳輸的。緩存
WHAT IS HTTPHEADER安全
HTTP Headers(HTTP頭部)是HTTP請求和相應的核心,它承載了關於客戶端瀏覽器,請求頁面,服務器等相關的信息。服務器
HTTP Headers 中的 HTTP請求cookie
當咱們打開瀏覽器,點擊一個超級連接的時候(好比https://www.google.com.hk/ )此時瀏覽器會作出相似以下的HTTP請求app
這個圖是我在打開這個網頁的時候用HTTP Analyzer抓取的dom
下面咱們一行一行的來解釋各句話的的意思
第一行,被稱做「Request - Line」請求行它包括三個部分:
I)第一個字段爲「method」 它代表這是何種類型的請求. 最多見的請求類型有 GET, POST 和 HEAD.學過WEB的應該比較熟悉這三種方法的區別與聯繫,此處使用的是GET 方法,這也是瀏覽器中比較經常使用的方法
II)第二個字段爲「path」 它體現的是主機以後的路徑. 例如,當你作出請求
GET /webhp?hl=zh-CN&sourceid=cnh path HTTP/1.1時path就是
「/webhp?hl=zh-CN&sourceid=cnhes/」.它表示獲取/webhp?hl=zh-CN目錄下資源ID爲 cnhes的頁面,再如GET /images/logo.gif HTTP/1.1,表示從/images目錄下請求logo.gif 動態圖片文件。
III)第三個字段爲「protocol」 包含有 「HTTP」 和版本號, 現代瀏覽器都會使用1.1.
剩下的部分每行都是一個「Name:Value」對。它們包含了各式各樣關於請求和你瀏覽器的信息
第二行,字段以下 它指明瞭主機的名稱很顯然這是Google的web服務器;
第三行,字段以下. 它代表了連接狀態
若是爲close 則表示告訴WEB服務器或者代理服務器,在完成本次請求的響應後,斷開鏈接,不要等待本次鏈接的後續請求了;
Keepalive 則表示告訴WEB服務器或者代理服務器,在完成本次請求的響應後,保持鏈接,等待本次鏈接的後續請求。
Keep-Alive:若是瀏覽器請求保持鏈接,則該頭部代表但願 WEB 服務器保持鏈接多長時間(秒)。例如:Keep-Alive:300
第四行,
是在告訴web服務器本身接受什麼樣的介質text/html表示接受text文檔下的子文檔html文檔,*/*表示接受全部的文檔
第五行
它指明瞭
一、瀏覽器名,版本號,Moziall/5.0 Chrome/31.0.1650.63 Safari/537.36AppleWebKit/537.36 (KHTML, like Gecko)
二、操做系統名,版本號Windows NT 6.1; WOW64)
三、默認的)語言等
第六行,這應該是Chrome的一些變量參數,我也不太清楚這個東西
第七行,表示能夠接受的編碼,大部分的現代瀏覽器都支持gzip壓縮,並會把這一信息報告給服務器。這時服務器就會壓縮過的HTML發送給瀏覽器。
這能夠減小近80%的文件大小,以節省下載時間和帶寬。
第八行,表示支持的語言
這個信息能夠說明用戶的默認語言設置。若是網站有不一樣的語言版本,那麼就能夠經過這個信息來重定向用戶的瀏覽器。它還能夠經過逗號分割來攜帶多國語言。第一個會是首選的語 言,其它語言會攜帶一個「q」值,來表示用戶對該語言的喜愛程度(0~1)。
第九行,
是有關cookie的說明
另外,還可能有以下字段一併整理以下
Referer字段
Referer字段容許客戶端指定請求uri的源資源地址,這能夠容許服務器生成回退鏈表,可用來登錄、優化cache等。他也容許廢除的或錯誤的鏈接因爲維護的目的被追蹤。
若是請求的uri沒有本身的uri地址,Referer不能被髮送。若是指定的是部分uri地址,則此地址應該是一個相對地址。
Range字段
Range字段能夠請求實體的一個或者多個子範圍。例如,
表示頭500個字節:bytes=0-499
表示第二個500字節:bytes=500-999
表示最後500個字節:bytes=-500
表示500字節之後的範圍:bytes=500-
第一個和最後一個字節:bytes=0-0,-1
同時指定幾個範圍:bytes=500-600,601-999
可是服務器能夠忽略此請求頭,若是無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是以200(OK)。
HTTP Headers 中的 HTTP響應
這是HTTP響應的Header部分
第一行,「Status Header」稱爲狀態行HTTP/1.1 302 Found意思是說,請求的資源如今臨時從不一樣的 URI 響應請求。
因爲這樣的重定向是臨時的,客戶端應當繼續向原有地址發送之後的請求,下附HTTP狀態碼錶
狀態碼 |
已定義範圍 |
分類 |
1XX |
100-101 |
信息提示 |
2XX |
200-206 |
成功 |
3XX |
300-305 |
重定向 |
4XX |
400-415 |
客戶端錯誤 |
5XX |
500-505 |
服務器錯誤 |
下面是詳細更的解釋
I)1XX信息狀態碼
狀態碼 |
狀態消息 |
含義 |
100 |
Continue(繼續) |
收到了請求的起始部分,客戶端應該繼續請求 |
101 |
Switching Protocols(切換協議) |
服務器正根據客戶端的指示(Update Header)切換協議 |
II)2XX成功狀態碼
狀態碼 |
狀態消息 |
含義 |
200 |
OK |
服務器成功處理了請求(這個是咱們見到最多的) |
201 |
Created(已建立) |
對於那些要服務器建立對象的請求來講,資源已建立完畢。 |
202 |
Accepted(已接受) |
請求已接受, 但服務器還沒有處理 |
203 |
Non-Authoritative Information(非權威信息) |
服務器已將事務成功處理,只是實體Header包含的信息不是來自原始服務器,而是來自資源的副本。 |
204 |
No Content(沒有內容) |
Response中包含一些Header和一個狀態行, 但不包括實體的主題內容(沒有response body) |
205 |
Reset Content(重置內容) |
另外一個主要用於瀏覽器的代碼。意思是瀏覽器應該重置當前頁面上全部的HTML表單。 |
206 |
Partial Content(部份內容) |
部分請求成功 |
III)3XX成功狀態碼
狀態碼 |
狀態消息 |
含義 |
300 |
Multiple Choices(多項選擇) |
客戶端請求了實際指向多個資源的URL。這個代碼是和一個選項列表一塊兒返回的,而後用戶就能夠選擇他但願的選項了 |
301 |
Moved Permanently(永久移除) |
請求的URL已移走。Response中應該包含一個Location URL, 說明資源如今所處的位置 |
302 |
Found(已找到) |
與狀態碼301相似。但這裏的移除是臨時的。 客戶端會使用Location中給出的URL,從新發送新的HTTP request |
303 |
See Other(參見其餘) |
相似302 |
304 |
Not Modified(未修改) |
客戶的緩存資源是最新的, 要客戶端使用緩存 |
305 |
Use Proxy(使用代理) |
必須經過代理訪問資源, 代理的地址在Response 的Location中 |
306 |
未使用 |
這個狀態碼當前沒使用 |
307 |
Temporary Redirect(臨時重定向 |
相似302 |
IV)客戶端錯誤狀態碼
狀態碼 |
狀態消息 |
含義 |
400 |
Bad Request(壞請求) |
告訴客戶端,它發送了一個錯誤的請求。 |
401 |
Unauthorized(未受權) |
須要客戶端對本身認證 |
402 |
Payment Required(要求付款) |
這個狀態還沒被使用, 保留給未來用 |
403 |
Forbidden(禁止) |
請求被服務器拒絕了 |
404 |
Not Found(未找到) |
未找到資源 |
405 |
Method Not Allowed(不容許使用的方法) |
不支持該Request的方法。 |
406 |
Not Acceptable(沒法接受) |
|
407 |
Proxy Authentication Required(要求進行代理認證) |
與狀態碼401相似, 用於須要進行認證的代理服務器 |
408 |
Request Timeout(請求超時) |
若是客戶端完成請求時花費的時間太長, 服務器能夠回送這個狀態碼並關閉鏈接 |
409 |
Conflict(衝突) |
發出的請求在資源上形成了一些衝突 |
410 |
Gone(消失了) |
服務器曾經有這個資源,如今沒有了, 與狀態碼404相似 |
411 |
Length Required(要求長度指示) |
服務器要求在Request中包含Content-Length。 |
412 |
Precondition Failed(先決條件失敗) |
|
413 |
Request Entity Too Large(請求實體太大) |
客戶端發送的實體主體部分比服務器可以或者但願處理的要大 |
414 |
Request URI Too Long(請求URI太長) |
客戶端發送的請求所攜帶的URL超過了服務器可以或者但願處理的長度 |
415 |
Unsupported Media Type(不支持的媒體類型) |
服務器沒法理解或不支持客戶端所發送的實體的內容類型 |
416 |
Requested Range Not Satisfiable(所請求的範圍未獲得知足) |
|
417 |
Expectation Failed(沒法知足指望) |
|
VI)服務器端錯誤狀態碼
狀態碼 |
狀態消息 |
含義 |
500 |
Internal Server Error(內部服務器錯誤) |
服務器遇到一個錯誤,使其沒法爲請求提供服務 |
501 |
Not Implemented(未實現) |
客戶端發起的請求超出服務器的能力範圍(好比,使用了服務器不支持的請求方法)時,使用此狀態碼。 |
502 |
Bad Gateway(網關故障) |
代理使用的服務器遇到了上游的無效響應 |
503 |
Service Unavailable(未提供此服務) |
服務器目前沒法爲請求提供服務,但過一段時間就能夠恢復服務 |
504 |
Gateway Timeout(網關超時) |
與狀態嗎408相似, 可是響應來自網關或代理,此網關或代理在等待另外一臺服務器的響應時出現了超時 |
505 |
HTTP Version Not Supported(不支持的HTTP版本) |
服務器收到的請求使用了它不支持的HTTP協議版本。 有些服務器不支持HTTP早期的HTTP協議版本,也不支持過高的協議版本 |
第二行,
這個頭部是用來重定向的。若是響應代碼爲 301 或者 302 ,服務器就必須發送該頭部。
第三行,
Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache-Control並不會修改另外一個消息處理過程當中的緩存處理過程。
請求時的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各個消息中的指令含義以下:
Public指示響應可被任何緩存區緩存。
Private指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這容許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其餘用戶的請求無效。
no-cache指示請求或響應消息不能緩存
no-store用於防止重要的信息被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存。
max-age指示客戶機能夠接收生存期不大於指定時間(以秒爲單位)的響應。
min-fresh指示客戶機能夠接收響應時間小於當前時間加上指定時間的響應。
max-stale指示客戶機能夠接收超出超時期間的響應消息。若是指定max-stale消息的值,那麼客戶機能夠接收超出超時期指定值以內的響應消息。
第四行,
這個頭部包含了文檔的」mime-type」。瀏覽器將會依據該參數決定如何對文檔進行解析。
Content-Type: text/html; charset=UTF-8
‘text’ 是文檔類型,‘html’則是文檔子類型。 這個頭部還包括了更多信息,例如 charset 指明瞭字符集;
若是是一個圖片,將會發送這樣的響應:Content-Type: image/gif 瀏覽器能夠經過mime-type來決定使用外部程序仍是自身擴展來打開該文檔。
以下的例子將會調用Adobe Reader:
Content-Type: application/pdf
直接載入,Apache一般會自動判斷文檔的mime-type而且添加合適的信息到頭部去。
而且大部分瀏覽器都有必定程度的容錯,在頭部未提供或者錯誤提供該信息的狀況下它會去自動檢測mime-type。
第五行,很顯然,這是指明瞭響應的時間(GMT爲格林威治世界時間)。
第六行,
Server響應頭包含處理請求的原始服務器的軟件信息。此域能包含多個產品標識和註釋,產品標識通常按照重要性排序顯然,Google使用的是自家的Google Web Server
下附國內網站的Web服務器表
企業名稱 |
Web服務器 |
說明 |
谷歌中國 |
Gws |
谷歌自主開發的Google Web Server |
百度 |
BWS |
由百度自主開發的Baidu Web Server |
人人網 |
Ngnix |
由Igor Sysoev爲俄羅斯訪問量第二 的Rambler.ru站點開發的
|
騰訊 |
Ngnix |
|
163 |
Ngnix |
|
淘寶 |
Tengine (已開源) |
Ngnix的一個變種
|
Sina |
Apache |
|
搜狐 |
Apache |
Apache旗下的開源http服務器 |
開心網 |
Apache |
|
優酷 |
Apache |
第七行,
Content-Length: WEB 服務器告訴瀏覽器本身響應的對象的長度。
剩下的部分是有關安全的一些字段,這裏不作過多討論(暫不清楚具體意思)
有的還有Set-Cookie字段
Set-Cookie:BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; path=/; domain=.baidu.com
Set-Cookie:BD_CK_SAM=1;path=/
Set-Cookie:BDSVRTM=175; path=/
Set-Cookie:H_PS_PSSID=5013_5141_5041_1422_4261_4760; path=/; domain=.baidu.com
當一個網站須要設置或者更新你瀏覽的cookie信息時,它就會使用這樣的頭部
還有的會有這些字段
其中ExpireWEB服務器代表該實體將在何時過時,對於過時了的對象,只有在跟 WEB服務器驗證了其有效性後,才能用來響應客戶請求。
Last-Modified 顧名思義,這個頭部信息用GMT格式代表了文檔的最後修改時間;
Etag 服務器可能會將該信息和每一個被髮送文件一塊兒響應給瀏覽器。該值能夠包含文檔 的最後修改日期,文件大小或者文件校驗和。這是一個對象(好比URL)的標誌值, 就一個對 象而言,好比一個 html 文件,若是被修改了,其 Etag 也會別修改, 因此, ETag 的做用跟 Last-Modified 的做用差很少,主要供 WEB 服務器 判斷一個對象是 否改變了。好比前一次請 求某個 html 文件時,得到了其 ETag,當此次又請求這個文 件時,瀏覽器就會把先前得到的 ETag 值發送給 WEB 服務器,而後 WEB 服務器會 把這個 ETag 跟該文件的當前 ETag 進行 對比,而後就知道這個文件 有沒有改變了。
還有以下字段
If-Match:若是對象的 ETag 沒有改變,其實也就意味著對象沒有改變, 才執行請求的動做。
If-None-Match:若是對象的 ETag 改變了,其實也就意味著對象也改變了,才執行請求的動做。
對於Accept-Ranges
WEB服務器代表本身是否接受獲取其某個實體的一部分(好比文件的一部分)的請求。
bytes:表示接受,none:表示不接受
另外,還有
Vary:Accept-Encoding 訴代理服務器緩存兩種版本的資源:壓縮和非壓縮,這有助於避免一些公共代理不能正確地檢測Content-Encoding標頭的問題
Transfer-Encoding:chunked 當不能預先肯定報文體的長度時,不可能在頭中包含Content-Length域來指明報文體長度,此時就須要經過Transfer-Encoding域來肯定報文體長度,一般狀況 下,Transfer-Encoding域的值應當爲chunked,代表採用chunked編碼方式來進行報文體的傳輸。
基本上關於HTTP Headers的內容就到這裏了。但願能夠幫助到你們!