圖解HTTP第六章:HTTP首部

學習HTTP首部的結構和首部中各字段的用法。html

HTTP首部字段

使用首部字段是爲了給瀏覽器和server提供報文主體大小、所使用的語言、認證信息等內容。web

  • 首部字段相應單個HTTP首部可以有多個值。假設首部字段反覆,依據瀏覽器邏輯處理。有的以第一個爲準,有的以最後出現的爲準。算法

  • 4種首部字段類型瀏覽器

    • 通用首部字段(General Header Fields)
    • 請求首部字段(Request Header Fields)
    • 響應首部字段(Response Header Fields)
    • 實體首部字段(Entity Header Fields):針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間與實體有關的信息。

  • 首部字段一覽
    在HTTP通訊過程當中。不限於下面規範中的字段,還有CookieSet-CookieContent-Disposition等字段。緩存


    通用首部字段
    請求首部字段
    響應首部字段
    實體首部字段

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

HTTP首部字段依據緩存代理和非緩存代理的行爲,分紅2種類型(也可以依據類型分爲通用、請求、響應、實體首部字段):安全

  • 端到端首部(End-to-end Header)
    此類別中的首部會轉發給請求/響應相應的終於接收目標,且必須保存在由緩存生成的響應中,它必須被轉發。markdown

  • 逐跳首部(Hop-by-hop Header)
    此類別中的首部僅僅對單次轉發有效。會因經過緩存或代理而再也不轉發。必需要提供Connnection字段才幹使用hop-by-hop首部。cookie

    它們有(除了這些全是端到端首部):
    Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgradedom

通用首部字段:

  • Cache-Control:經過該命令,就能操做緩存的工做機制;參數是多選的,經過,分隔。ide

    • 表示可否緩存的指令:
      Cache-Control:public,代表其餘用戶也可以利用緩存
      Cache-Control:private。僅僅讓特定用戶緩存,緩存server會對該特定用戶提供資源緩存的服務。

    • no-cache指令:
      請求使用時,則表示client將不會接收緩存過的響應。因而緩存server必須轉發給源server。
      響應使用時,則表示緩存server不能緩存資源,源server也不正確緩存server請求中提出的資源有效性進行確認,且禁止其對響應資源進行緩存操做。

    • 控制可運行緩存對象的指令no-store
      no-store指令暗示請求(和相應的響應)中包括機密信息。所以規定緩存不能在本地存儲請求或響應的任一部分。

    • 指定緩存期限和認證的指令

    • max-age=60(秒)
      請求使用時,則斷定緩存資源的緩存時間,小就獲取緩存,大則緩存server轉發給源server。


      響應使用時,緩存server將不正確資源的有效性再做確認。該時間表示資源有效時間。

    • s-maxage=60(秒):功能和max-age指令一樣。但s-maxage僅僅適用於供多位用戶使用的公共緩存server。即對同一用戶反覆返回響應的server不起做用。使用s-maxage後,Expiresmax-age會被忽略。
    • min-refresh=60(秒):要求緩存server返回至少還未過指定時間的緩存資源。
    • max-stale=60(秒):表示緩存資源即便過時,但仍處於該指令指定時間內,仍舊會被client接收。

      如未指定詳細數值,則緩存資源一直有效。

    • only-if-cached:要求緩存server不又一次載入響應。也不確認資源的有效性,直接返回。若緩存server無該緩存,則返回504。
    • must-revalidate:代理會向源server再次驗證即將返回的響應緩存眼下是否仍然有效。若代理沒法鏈接到源server的話。則返回504。使用must-revalidate時會忽略max-stale指令。


      假設緩存過了新奇期,則必須又一次驗證.而不是試圖返回一個不在新奇期的緩存.與no-cache的差異在於,no-cache,全然無視新奇期的概念.老是強制又一次驗證.理論上,must-revalidate更節省流量,但相比no-cache,可能並不老是那麼精準.因爲即便緩存者。以爲是新奇的,也不能保證server端沒有作過更新.假設緩存者是一個緩存代理server,假設其試圖又一次驗證時,沒法鏈接上原始server,則也不一樣意返回一個不新奇的,緩存中的副本.而是必須返回一個504 Gateway timeout.

    • proxy-revalidate:限制上與must-revalidate類似.差異在於受體的範圍.proxy-revalidate,是要排除掉用戶代理(瀏覽器)的緩存的.即,其規則並不該用於用戶代理的本地緩存上.
    • no-transform:無論請求仍是響應中,緩存都不能改變實體主體的媒體類型。可以防止緩存或代理壓縮圖片等操做。
    • cache-extension:經過該指令標記,可以擴展Cache-Control首部字段內的指令。
      緩存請求指令
      緩存響應指令
  • Connection:
    兩個做用:

    • 控制再也不轉發給代理的首部字段
      client發送請求和server返回的響應內。使用Connection首部字段可控制再也不轉發給代理的首部字段(Hop-by-hop首部)。
    • 管理持久鏈接
      Connection:closeConnection:Keep-Alive表示服務端想斷開鏈接或保持持久鏈接。
  • Date:代表HTTP報文的日期和時間

  • Pragma:Progma:no-cache遺留字段, 僅僅在client發送的請求中,要求緩存server不返回緩存的資源。
  • Trailer:說明在報文主體後記錄了哪些首部字段。可應用在分塊傳輸編碼時。
  • Transfer-Encoding:規定了傳輸報文主體時採用的編碼方式。僅對分塊傳輸編碼有效。

  • Upgrade:在使用該字段時。需額外指定Connection:Upgrade,用於檢測是否可以使用更高的版本號進行通訊。可以指定一個全然不一樣的通訊協議。

  • Via:追蹤client和server之間的請求和響應報文的傳輸路徑,可以避免請求迴環的發送。報文通過代理或網關時,會先在首部字段Via中附加該server的信息。而後轉發。
  • Warning:告知用戶一些與緩存相關的問題的警告。

請求首部字段

  • Accept:可通知server,用戶代理可以處理的媒體類型及媒體類型的相對優先級。

    可用用type/subtype這樣的形式。一次指定多種媒體類型。

  • Accept-Charset:通知server用戶代理支持的字符集及字符集的相對優先順序。可一次指定多種字符集。

  • Accept-Encoding:告知server用戶代理支持的內容編碼及內容編碼的優先級順序。

    可一次指定多種內容編碼。

    gzipcompressdeflateidentity

  • Accept-Language:告知server用戶代理可以處理的天然語言集,以及優先級。可一次指定多種。
  • Authorization:
  • Expect:告知server,指望出現的某種特定行爲。因server沒法理解client的指望做出迴應而錯誤發生時,會返回417 Expectation Failed。
  • From:告知server用時用戶代理的用戶的電子郵件地址。

  • Host:虛擬主機運行在同一個IP上,使用Host區分。必須被包括在請求內的首部字段。

  • 形如If-xxx這樣的請求首部。均可成爲條件請求。

    server接收到附帶條件的請求後,僅僅有推斷指定條件爲真時。纔會運行請求。

    • If-Match:它會告知server匹配資源所用的實體標記(ETag)值,這時的server沒法使用弱ETag值。server會對照If-Match的字段值和資源的ETag值。僅當二者一致時,纔會運行請求。反之,返回412 Precondition Failed。可以使用*指定If-Match值。server會忽略ETag值,僅僅要資源存在就處理請求。

    • If-None-Match:和If-Match做用相反。

      僅僅有在If-None-Match值與ETag值不一致時,可處理該請求。

    • If-Modified-Since:server在If-Modified-Since值後資源更新過,則處理該請求。假設沒有更新過,則返回304 Not Modified。用於確認代理或client擁有的本地資源的有效性。
    • If-Range:告知server指定的If-Range值(ETag值或時間)和請求資源的ETag值或時間相一致時。則做爲範圍請求處理。反之,則返回全體資源。

      通常和Range請求頭連用。

    • If-Unmodified-Since:和If-Modified-Since相反。指定的請求資源僅僅有在字段值內指定的日期時間以後。未發生更新的狀況下,才幹處理請求。反之返回412 Precondition Failed。
  • Max-Forwards:經過Trace或OPTIONS方法,發送包括首部字段Max-Forwards請求時,十進制整數。每轉發一次,值減一,爲0值。則再也不轉發,直接返回響應。

  • Proxy-Authorization:接收到從代理server發來的認證質詢時,client會使用該首部,以告知server認證所需要的信息。
  • Range:獲取部分資源的範圍請求。

    成功處理時,返回206 Partial Content響應;沒法處理時,返回200 OK。

  • Referer:會告知server請求的原始資源的URI。
  • TE:告知serverclient可以處理的傳輸編碼方式及相對優先級。和Accept-Encoding功能很是像,但用於傳輸編碼。
    還可以指定伴隨trailer字段的分塊傳輸編碼方式。僅僅需要TE:trailers來指明。
  • User-Agent:會將建立請求的瀏覽器和用戶代理名稱等信息傳達給server。

響應首部字段

  • Accept-Ranges:用來告知clientserver可否處理範圍請求。以指定獲取server某個部分的資源。兩個值:Accept-Ranges:bytesAccept-Ranges:none

  • Age:單位是秒。指源server多久前建立了響應;假設是緩存server時,表示緩存後的響應再次發起認證到認證完畢的時間值。代理建立的響應必須加上Age。
  • ETag:ETag能告知client實體標識。它是一種可將資源以字符串形式作惟一性標識的方式。server會爲每份資源分配相應的ETag值。
    強ETag值:實體發生的細微變化都會改變其值
    弱ETag值:僅僅用於提示資源是否一樣。僅僅有發生根本性改變。ETag值纔會變化,會在字段值開始處附加W/
  • Location:將響應接收方引導至某個與請求URI位置不一樣的資源。

    基本上它會和3xx : Redirection重定向一塊使用。差點兒所有瀏覽器在接收到Location響應後,都會強制性的嘗試對已提示的重定向資源的訪問。

  • Proxy-Authenticate:把由代理server所要求的認證信息發送給client。
  • Retry-After:告知client應該在多久以後再次發送請求,主要配合503 Service Unavalible或3xx Redirection一塊兒使用。字段值可以指定詳細日期時間、或建立響應後的秒數。
  • Server:告知client當前server上安裝的HTTPserver應用程序的信息。包括軟件應用名稱、可能還有版本號號和安裝時啓用的可選項。

  • Vary:該首部可以對緩存進行控制。源server會向代理server傳達關於本地緩存用法的命令。
    從代理server接收到源server返回包括Vary指定項的響應以後,再次接收到請求時,僅返回一樣Vary首部的緩存;其餘則必需要從源server又一次獲取。
  • WWW-Authenticate:用於HTTP訪問認證。會告知client適用於訪問請求URI所指定資源的認證方案和帶參數提示的質詢。

    狀態碼401 Unauthorized響應中,確定有這個首部字段。

實體首部字段

實體首部字段是在請求報文和響應報文中的實體部分所使用的首部。用於補充內容的更新時間等與實體相關的信息。

實體:做爲請求或響應的有效載荷數據被傳輸,其內容由實體首部和實體主體組成。
實體

  • Allow:
    用於通知client可以可以支持Request-UIR指定資源的所有HTTP方法。當server接收到不支持的HTTP方法時,會返回狀態碼405 Method Not Allowed,同一時候會把所有能支持的HTTP方法寫入首部字段Allow後返回。
  • Content-Encoding:
    告知clientserver對實體的主體部分選用的內容編碼方式。

  • Content-Language:
    告知client。實體主體使用的天然語言。

  • Content-Length:
    代表了實體主體部分的大小(字節)。

    對實體主體進行內容編碼傳輸時。不能再使用Content-Length首部字段。

  • Content-Location:
    給出與報文主體部分相相應的URI,表示返回的資源相應的URI。
  • Content-MD5:
    是一串由MD5算法生成的值,其目的在於檢查報文主體在傳輸過程當中是否保持完整。以及確認傳輸到達。
  • Content-Range:Content-Range:bytes5001-10000/10000
    告訴client做爲響應返回的實體的哪一個部分符合範圍請求。

    以字節爲單位。表示當前發送部分及整個實體大小。

  • Content-Type:
    說明了實體主體內對象的媒體類型。

  • Expires:
    會將資源失效的日期告知client。
    緩存server在接收到含有首部字段Expires的響應後,會以緩存來應答請求,在Expires字段值指定時間以前,緩存一直有效。超過是,會向源server請求資源。
    源server不但願緩存server對資源緩存時。在Expries字段內寫入與首部字段Date一樣的時間值。
    當Cache-Control指定了max-age指令時。會有限處理。

  • Last-Modified
    指明資源終於改動時間。

爲Cookie服務的首部字段

爲Cookie服務的首部字段

  • Set-Cookie:
    Set-Cookie字段的屬性

    • name:必須項。name=xxx
    • expires:指定瀏覽器可發送Cookie的有效期。
    • path:可用於限定Cookie的發送範圍的文件文件夾。不能保證安全。

    • domain:經過該屬性指定的域名可作到與結尾匹配一致就能夠發送Cookie。
    • secure:該屬性用於限制Web頁面僅在HTTPS安全鏈接時,才幹夠發送Cookie。

      Set-Cookie:name=xxx;secure
      HttpOnly:使Js腳本沒法得到Cookie,防止XSS(Cross-site scripting)對Cookie的信息竊取。Set-Cookie:name=xxx;HttpOnly

  • Cookie:告知server,當client想得到HTTP狀態管理支持時。就會在請求中包括從server接收到的Cookie。接收到多個Cookie時。可以以多個Cookie形式發送。

參考:
你應該瞭解的 一些web緩存相關的概念.

相關文章
相關標籤/搜索