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

zhaoyezi發表於2018-09-10

1. HTTP 報文

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

2. HTTP首部欄位型別

HTTP首部欄位是構成HTTP報文的要素之一。在客戶端和伺服器端以HTTP協議進行通訊的過程中,無論是請求還是響應:都會使用首部欄位,它能起到傳遞額外重要資訊的作用。

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

3 通用首部欄位

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

3.1 Cache-Control

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

// 操作快取的工作機制。引數使用`,`分割
Cache-Control: private, max-age=0, no-cache
複製程式碼

public : 表明其他使用者可以利用快取

private: 表明只能特定使用者作為物件(與public相反)。快取伺服器會對特定使用者提供快取的服務,對於其他使用者發過來的請求,代理伺服器不會返回快取。

no-cache:從字面意義上很容易誤解為不快取,但是no-cache代表不快取過期的資源,快取會向伺服器進行有效處理確認之後處理資源

  • 客戶端請求包含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(單位秒):快取的資源即使過期了也照常接收。

  • 未指定引數,無論過多久,客戶端都會響應
  • 指定具體值,那麼即使過期,但人處於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"
複製程式碼

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

3.2 Connection

Connection 首部: 控制不再轉發給代理的首部欄位 和 管理持久化連線。

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

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

  • 管理持久化連線: HTTP/1.1預設連線是keep-alive持久連線,當伺服器想明確斷開連線,使用Connection: close

3.3 其他 通用首部欄位

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

Pragma: 僅為相容歷史版本而存在。Pragma: no-cache

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

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

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

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

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

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

Via: 在經過代理時附加該首部欄位內容。追蹤客戶端與伺服器之前的請求和響應報文的傳輸路徑

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

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

Warning: 告知使用者一些與快取相關的警告問題。

Warning: [警告碼][警告的主機:埠號]“[警告內容]”([日期時間])

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

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

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.xml
3:從P3P隱私中新建Compact plicies後,輸出到HTTP響應中

相關文章