05 前端HTTP協議(圖解HTTP) 之 HTTP首部

1. HTTP 報文

HTTP報文 = 報文首部 + '空行(CR+LF)' + 報文主體
複製代碼

2. HTTP首部字段類型

HTTP首部字段是構成HTTP報文的要素之一。在客戶端和服務器端以HTTP協議進行通訊的過程當中,不管是請求仍是響應:都會使用首部字段,它能起到傳遞額外重要信息的做用。
javascript

  • 通用首部字段(General Header Fileds): 請求和響應報文都會使用的首部
  • 請求首部字段(Request Header Fields): 從客戶端發起請求時使用。補充了請求的附加內容,客戶端信息,響應內容相關優先級。
  • 響應首部字段(Response Header Fields): 從服務端向客戶端返回響應報文時使用的首部。補充了響應的附加內容,也會要求客戶端附加額外的信息。
  • 實體首部字段(Entity Header Fields): 針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等於實體有關的信息。

3 通用首部字段


3.1 Cache-Control


// 操做緩存的工做機制。參數使用`,`分割
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"
複製代碼


3.2 Connection

Connection 首部: 控制再也不轉發給代理的首部字段 和 管理持久化鏈接。

  • 客戶端發送請求和服務器返回響應 內,使用Connection首部字段,控制再也不轉發的首部字段(即Hop-by-hop)。


  • 管理持久化鏈接: HTTP/1.1默認鏈接是keep-alive持久鏈接,當服務器想明確斷開鏈接,使用Connection: close

3.3 其餘 通用首部字段

首部字段Date: 建立HTTP報文的日期和事件。

Pragma: 僅爲兼容歷史版本而存在。Pragma: no-cache

Trailer: 事先說明在報文主體後記錄了哪些首部字段。 該首部字段可應用在 HTTP/1.1 版本分塊傳輸編碼時。


Transfer-Encoding: 規定傳輸報文主體時採用的編碼方式。僅對分塊傳輸編碼有效。


Upgrade: 用於檢測HTTP協議及其餘協議是否可以使用更高的版本進行通訊。


Via: 在通過代理時附加該首部字段內容。追蹤客戶端與服務器以前的請求和響應報文的傳輸路徑

  • 常常會和 TRACE 方法一塊兒使用。如, 代理服務器接收到由 TRACE 方法發送過來的請求(其中Max-Forwards: 0) 時, 代理服務器就不能再轉發該請求了。 這種狀況下, 代理服務器會將自身的信息附加到 Via 首部後, 返回該請求的響應。


Warning: 告知用戶一些與緩存相關的警告問題。

Warning: [警告碼][警告的主機:端口號]「[警告內容]」([日期時間])

Warning: 113 gw.hackr.jo:8080 "something is expiration" Tue 03
複製代碼


4. 請求首部字段

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-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

5. 響應首部字段

首部字段 描述 詳細參數
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 Unavailable3xx 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

6. 實體首部字段

首部字段 描述 詳細參數
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

8. End-to-end 首部和Hop-by-hop首部

HTTP首部字段將定義緩存代理非緩存代理的行爲。

逐跳首部(Hop-by-hop Header): 該類首部支隊單次轉發有效,會因經過緩存或代理而再也不轉發。HTTP/1.1後若是要使用Hop-by-hop首部,需提供Connection首部字段。

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • Trailer
  • TE
  • Transfer-Encoding
  • Upgrade

端到端首部(End-to-end Header): 除上面的逐跳首部,都屬於該類。分到該類的首部會轉發給請求 / 響應對應的最終接收目標,且必須保存在由緩存生成的響應中,另外規定它必須被轉發

8. 非HTTP/1.1首部字段

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: 指示服務器回覆的內容該以何種形式展現,是之內聯的形式(即網頁或者頁面的一部分),仍是以附件的形式下載並保存到本地。

9. 其餘首部字段

首部字段 描述
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響應中
相關文章
相關標籤/搜索