HTTP 通用首部字段(General Header Fields)

通用首部字段是請求報文和響應報文兩方都會使用的首部。

Cache-Control

通過指定首部字段 Cache-Control 的指令,被用于在 http 請求和響應中,通過指定指令來實現(xiàn)緩存機制。緩存指令是單向的,這意味著在請求中設置的指令,不一定被包含在響應中。

指令的參數(shù)是可選的,多個指令之間通過“,”分隔。首部字段 Cache-Control 的指令可用于請求及響應時。

Cache-Control: private, max-age=0, no-cache

緩存請求指令

緩存響應指令

public 指令

當指定使用 public 指令時,則明確表明其他用戶也可以緩存。

private 指令

當指定 private 指令后,緩存服務器只會對特定用戶提供資源緩存的服務,對于其他用戶發(fā)送過來的請求,代理服務器則不會緩存。

no-cache 指令

控制可執(zhí)行緩存的對象的指令。

使用 no-cache 指令的目的是為了防止從緩存中返回過期的資源。

客戶端發(fā)送的請求中如果包含 no-cache 指令,則表示客戶端將不會接收緩存過的響應。于是,“中間”的緩存服務器必須把客戶端請求轉(zhuǎn)發(fā)給源服務器。

如果服務器返回的響應中包含 no-cache 指令,那么緩存服務器不會對資源進行緩存。源服務器以后也將不再對緩存服務器請求中提出的資源有效性進行確認,且禁止其對響應資源進行緩存操作。

Cache-Control: no-cache=Location

由服務器返回的響應中,若報文首部字段 Cache-Control 中對 no-cache 字段名指定了參數(shù)值,那么客戶端在接收到這個被指定參數(shù)值的首部字段對應的響應報文后,就不能使用緩存。換句話說,無參數(shù)值的首部字段可以使用緩存。

no-store 指令

當使用 no-store 指令時,暗示請求(和對應的響應)或響應中包含機密信息。因此,緩存不能在本地存儲請求或響應的任一部分。

從字面意思上很容易把 no-cache 誤解成為不緩存,但事實上 no-cache 代表不緩存過期的資源,緩存會向源服務器進行有效期確認后處理資源,也許稱為 do-not-serve-from-cache-without-revalidation 更合適。no-store 才是真正地不進行緩存,請注意區(qū)別理解。

s-maxage 指令

s-maxage 指令的功能和 max-age 指令的相同,它們的不同點是 s-maxage 指令只適用于多用戶、公共緩存的代理服務器。也就是說,對于同一用戶重復返回響應的服務器來說,這個指令沒有任何作用。

另外,當使用 s-maxage 指令后,則直接忽略對 Expires 首部字段及 max-age 指令的處理。

max-age 指令

當客戶端發(fā)送的請求中包含 max-age 指令時,如果判定緩存資源的緩存時間數(shù)值比指定時間的數(shù)值更小,那么客戶端就接收緩存的資源。 另外,當指定 max-age 值為 0,那么緩存服務器通常需要將請求轉(zhuǎn)發(fā)給源服務器。

當服務器返回的響應中包含 max-age 指令時,緩存服務器將不對資源的有效性再作確認,而 max-age 數(shù)值代表資源保存為緩存的最長時 間。

應用 HTTP/1.1 版本的緩存服務器遇到同時存在 Expires 首部字段的情況時,會優(yōu)先處理 max-age 指令,而忽略掉 Expires 首部字段。而 HTTP/1.0 版本的緩存服務器的情況卻相反,max-age 指令會被忽略掉。

min-fresh 指令

min-fresh 指令要求緩存服務器返回至少還未過指定時間的緩存資源。

比如,當指定 min-fresh 為 60 秒后,過了 60 秒的資源都無法作為響應返回了。

max-stale 指令

使用 max-stale 可指示緩存資源,即使過期也照常接收。

如果指令未指定參數(shù)值,那么無論經(jīng)過多久,客戶端都會接收響應;如果指令中指定了具體數(shù)值,那么即使過期,只要仍處于 max-stale 指定的時間內(nèi),仍舊會被客戶端接收。

only-if-cached 指令

使用 only-if-cached 指令表示客戶端僅在緩存服務器本地緩存目標資源的情況下才會要求其返回。換言之,該指令要求緩存服務器不重新加載響應,也不會再次確認資源有效性。若發(fā)生請求緩存服務器的本地緩存無響應,則返回狀態(tài)碼 504 Gateway Timeout。

must-revalidate 指令

使用 must-revalidate 指令,代理會向源服務器再次驗證即將返回的響應緩存目前是否仍然有效。

若代理無法連通源服務器再次獲取有效資源的話,緩存必須給客戶端一條 504(Gateway Timeout)狀態(tài)碼。

另外,使用 must-revalidate 指令會忽略請求的 max-stale 指令(即使已經(jīng)在首部使用了 max-stale,也不會再有效果)。

proxy-revalidate 指令

proxy-revalidate 指令要求所有的緩存服務器在接收到客戶端帶有該指令的請求返回響應之前,必須再次驗證緩存的有效性。

no-transform 指令

使用 no-transform 指令規(guī)定無論是在請求還是響應中,緩存都不能改變實體主體的媒體類型。

這樣做可防止緩存或代理壓縮圖片等類似操作。

cache-controal 擴展

通過 cache-extension 標記(token),可以擴展 Cache-Control 首部字段內(nèi)的指令。

Cache-Control: private, community="UCI"

如上例,Cache-Control 首部字段本身沒有 community 這個指令。借助 extension tokens 實現(xiàn)了該指令的添加。如果緩存服務器不能理解 community 這個新指令,就會直接忽略。因此,extension tokens 僅對能理解它的緩存服務器來說是有意義的。

Connection

決定當前的事務完成后,是否會關(guān)閉網(wǎng)絡連接。如果該值是“keep-alive”,網(wǎng)絡連接就是持久的,不會關(guān)閉,使得對同一個服務器的請求可以繼續(xù)在該連接上完成。

close 指令

HTTP/1.0 請求的默認值,表明客戶端或服務器想要關(guān)閉該網(wǎng)絡連接。

keep-alive 指令

表明客戶端想要保持該網(wǎng)絡連接打開,HTTP/1.1 的請求默認使用一個持久連接。這個請求頭列表由頭部名組成,這些頭將被第一個非透明的代理或者代理間的緩存所移除:這些頭定義了發(fā)出者和第一個實體之間的連接,而不是和目的地節(jié)點間的連接。

Date

首部字段 Date 表明創(chuàng)建 HTTP 報文的日期和時間。

HTTP/1.1 協(xié)議使用在 RFC1123 中規(guī)定的日期時間的格式,如下示例:

Date: Tue, 03 Jul 2012 04:40:59 GMT

HTTP/1.1 之前的 HTTP 協(xié)議版本中使用在 RFC850 中定義的格式,如下所示:

Date: Tue, 03-Jul-12 04:40:59 GMT

除此之外,還有一種格式。它與 C 標準庫內(nèi)的 asctime() 函數(shù)的輸出格式一致:

Date: Tue Jul 03 04:40:59 2012

Pragma

Pragma 是 HTTP/1.1 之前版本的歷史遺留字段,僅作為與 HTTP/1.0 的向后兼容而定義。

規(guī)范定義的形式唯一,如下所示:

Pragma: no-cache

該首部字段屬于通用首部字段,但只用在客戶端發(fā)送的請求中。客戶端會要求所有的中間服務器不返回緩存的資源。

所有的中間服務器如果都能以 HTTP/1.1 為基準,那直接采用 Cache-Control: no-cache 指定緩存的處理方式是最為理想的。但要整體掌握全部中間服務器使用的 HTTP 協(xié)議版本卻是不現(xiàn)實的。因此,發(fā)送的請求會同時含有下面兩個首部字段:

Cache-Control: no-cache
Pragma: no-cache

Trailer

Trailer 是一類特殊的首部字段,HTTP 協(xié)議在返回數(shù)據(jù)的時候通常是先發(fā)送 Header 信息,再發(fā)送 Body 數(shù)據(jù),而 Trailer 會在 Body 傳輸結(jié)束后,再將內(nèi)容“補發(fā)”給接收方。

發(fā)送方需要事先說明在報文主體后記錄了哪些首部字段,可以指定多個,以逗號分隔。

該首部字段可應用在 HTTP/1.1 版本分塊傳輸編碼時。

HTTP/1.1 200 OK
Content-Type: text/plain
...
Transfer-Encoding: chunked
Trailer: Expires

... 報文主體...
0
Expires: Tue, 03 Jul 2012 04:40:56 GMT

以上用例中,指定首部字段 Trailer 的值為 Expires,在報文主體之后 (分塊長度 0 之后)”補發(fā)”了首部字段 Expires 中的內(nèi)容。

Transfer-Encoding

首部字段 Transfer-Encoding 規(guī)定了傳輸報文主體時采用的編碼方式。

HTTP/1.1 的 Transfer-Encoding 僅對分塊傳輸編碼有效。

最后

我的個人主頁 里也同步進行了更新,歡迎來逛逛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • HTTP首部字段共分為以下4種類型: 通用首部字段(General)請求報文和響應報文都會使用的首部字段。 請求首...
    是小張啊啊閱讀 1,162評論 0 2
  • 通用首部是指請求報文和響應報文雙方都會使用的首部 Cahche-Control 通過指定首部字段Cache-Con...
    zlb閱讀 750評論 0 0
  • HTTP/1.1 通用首部字段 通用首部字段是指,請求報文和響應報文雙方都會使用的首部。 1.Cache-Cont...
    ssscen閱讀 2,063評論 1 3
  • HTTP 報文 HTTP 請求報文 在請求中,HTTP 報文由方法、URI、HTTP 版本、HTTP 首部字段等部...
    Yi__Lin閱讀 698評論 0 5
  • 報文分為請求報文與響應報文,除開報文實體的差異之外,兩者的報文首部內(nèi)容上也不盡相同。下圖是訪問www.baidu....
    Iswine閱讀 671評論 0 1

友情鏈接更多精彩內(nèi)容