HTTP/1.1 通用首部字段
通用首部字段是指,請(qǐng)求報(bào)文和響應(yīng)報(bào)文雙方都會(huì)使用的首部。
1.Cache-Control
通過(guò)指定首部字段 Cache-Control 的指令,就能操作緩存的工作機(jī)制。
指令的參數(shù)是可選的,多個(gè)參數(shù)之間通過(guò) , 分隔。首部字段 Cache-Control 的指令可用于請(qǐng)求及響應(yīng)時(shí)。
Cache-Control:private, max-age=0, no-cache
1.1. Cache-Control 指令一覽
緩存請(qǐng)求指令
| 指令 | 參數(shù) | 說(shuō)明 |
|---|---|---|
| no-cache | 無(wú) | 強(qiáng)制向源服務(wù)器再次驗(yàn)證 |
| no-store | 無(wú) | 不緩存請(qǐng)求或響應(yīng)的任何內(nèi)容 |
| max-age=[秒] | 必需 | 相應(yīng)的最大值 |
| max-stale(= [秒]) | 可省略 | 接收已過(guò)期的響應(yīng) |
| min-fresh=[秒] | 必需 | 期望在指定時(shí)間內(nèi)的響應(yīng)仍有效 |
| no-transform | 無(wú) | 代理不可更改媒體類型 |
| only-if-cached | 無(wú) | 從緩存獲取資源 |
| cache-extension | - | 新指令標(biāo)記(token) |
緩存響應(yīng)指令
| 指令 | 參數(shù) | 說(shuō)明 |
|---|---|---|
| public | 無(wú) | 可向任意方提供響應(yīng)的緩存 |
| private | 可省略 | 僅向特定用戶返回響應(yīng) |
| no-cache | 可省略 | 緩存服務(wù)器不能對(duì)資源進(jìn)行緩存 |
| no-store | 無(wú) | 不緩存請(qǐng)求或響應(yīng)的任何內(nèi)容 |
| no-transform | 無(wú) | 代理不可更改媒體類型 |
| must-revalidate | 無(wú) | 可緩存但必須再向源服務(wù)器進(jìn)行確認(rèn) |
| proxy-revalidate | 無(wú) | 要求中間緩存服務(wù)器對(duì)緩存的響應(yīng)有效性再進(jìn)行確認(rèn) |
| max-age=[秒] | 必需 | 響應(yīng)的最大 Age 值 |
| s-maxage=[秒] | 必需 | 公共緩存服務(wù)器響應(yīng)的最大Age值 |
| cache-extension | - | 新指令標(biāo)記(token) |
這里僅挑選幾個(gè)重要的指令來(lái)解釋
no-cache
no-cache:為了防止從緩存中返回過(guò)期的資源。
如果請(qǐng)求中包含 no-cache,表示客戶端不會(huì)接受緩存過(guò)的響應(yīng)?!爸虚g”的緩存服務(wù)器必須把客戶端請(qǐng)求轉(zhuǎn)發(fā)給源服務(wù)器。
如果源服務(wù)器返回的響應(yīng)中包含 no-cache,那么緩存服務(wù)器也不能對(duì)資源進(jìn)行緩存。
如果服務(wù)器返回的響應(yīng)中 no-cache 包含參數(shù)值,就表示當(dāng)客戶端接收到這個(gè)被指定的參數(shù)值的首部字段對(duì)應(yīng)的響應(yīng)報(bào)文后,就不能使用緩存。另外就是 no-store 表示真正的不允許緩存。
Cache-Control:no-cache=Location
max-age
Cache-Control:max-age=604800(單位:秒)
當(dāng)客戶端發(fā)送的請(qǐng)求中包含 max-age 指令時(shí),如果判定緩存資源的緩存時(shí)間數(shù)值比指定時(shí)間的數(shù)值更小,那么客戶端就接收緩存的資源。另外,當(dāng)指定 max-age 值為 0 ,那么緩存服務(wù)器通常需要將請(qǐng)求轉(zhuǎn)發(fā)給源服務(wù)器。
當(dāng)服務(wù)器返回的響應(yīng)中包含 max-age 時(shí),此時(shí)表示資源緩存的最長(zhǎng)時(shí)間,緩存服務(wù)器不再對(duì)資源的有效性進(jìn)行確認(rèn)。
在 HTTP/1.0 版本中,當(dāng) Expires 和 max-age (同時(shí)出現(xiàn)時(shí)),會(huì)優(yōu)先處理 max-age 指令,忽略 Expires。
min-fresh
Cache-Control:min-fresh=60(單位:秒)
min-fresh 指令要求緩存服務(wù)器返回至少還未過(guò)指定時(shí)間的緩存資源。當(dāng)指定 min-fresh=60 后,過(guò)了60秒的資源都無(wú)法作為響應(yīng)返回了。
max-stale
Cache-Control:max-stale=3600(單位:秒)
該指令表示即使過(guò)期也照常接收。
如果未指定參數(shù)值,則表示無(wú)論過(guò)期多長(zhǎng)時(shí)間都會(huì)接收
only-if-cached
Cache-Control:only-if-cached
表示客戶端僅在緩存服務(wù)器本地緩存目標(biāo)資源的情況下才會(huì)要求其返回?!?該指令要求緩存服務(wù)器不重新加載響應(yīng),也不會(huì)再次確認(rèn)資源有效性。若發(fā)生請(qǐng)求緩存服務(wù)器的本地緩存無(wú)響應(yīng),則返回狀態(tài)碼 504 Gateway Timeout。
must-revalidate
Cache-Control:must-revalidate
使用 must-revalidate 指令,代理會(huì)向源服務(wù)器再次驗(yàn)證即將返回的響應(yīng)緩存目前是否仍然有效。
若代理無(wú)法連通源服務(wù)器,緩存必須給客戶端一條 504(Gateway Timeout)狀態(tài)碼。
注意:使用 must-revalidate 會(huì)忽略 max-stale 。
proxy-revalidate
Cache-Control:proxy-revalidate
該指令要求所有的緩存服務(wù)器在接收到客戶端帶有該指令的請(qǐng)求返回響應(yīng)之前,必須再次驗(yàn)證緩存的有效性。
no-transform
Cache-Control:no-transform
該指令規(guī)定無(wú)論在請(qǐng)求還是響應(yīng)中,緩存都不能該表實(shí)體主體的媒體類型。
這樣可防止緩存或代理壓縮圖片等類似操作。
2.Connection
Connection的作用如下
- 控制不再轉(zhuǎn)發(fā)給代理的首部字段
- 管理持久連接
下面依次來(lái)對(duì)每個(gè)作用做說(shuō)明
2.1 控制不再轉(zhuǎn)發(fā)給代理的首部字段
Connection:不再轉(zhuǎn)發(fā)的首部字段名
在客戶端發(fā)送請(qǐng)求和服務(wù)器返回響應(yīng)內(nèi),使用該首部字段,可控制不再轉(zhuǎn)發(fā)給代理的首部字段
2.2 管理持久連接
Connection:close
HTTP/1.1 版本默認(rèn)連接都是持久連接。為此,客戶端會(huì)在持久連接上持續(xù)發(fā)送請(qǐng)求。當(dāng)服務(wù)器想明確斷開(kāi)連接時(shí),則指定 Connection 首部字段的值為 Close。
HTTP/1.1 之前的 HTTP 版本默認(rèn)連接都是非持久連接。為此,如果想在舊版本的 HTTP 協(xié)議上維持持續(xù)連接,則需要指定 Connection 首部字段值為 Keep-Alive。
如下圖①所示,客戶端發(fā)送請(qǐng)求給服務(wù)器時(shí),服務(wù)端會(huì)像下圖②那樣加上首部字段 Keep-Alive 及首部字段 Connection 后返回響應(yīng)。

3. Trailer
該字段會(huì)向服務(wù)器說(shuō)明在報(bào)文主體后面記錄了哪些首部字段。該首部字段可應(yīng)用在 HTTP/1.1 版本分塊傳輸編碼時(shí)。
Trailer: Expires
···報(bào)文主體···
0
Expires:Tue,28 Sep 2004 23:59:59 GMT
上面指定值為 Expires,在報(bào)文主體之后(分塊長(zhǎng)度0之后)出現(xiàn)了首部字段 Expires。
4. Upgrade
該字段用于檢測(cè) HTTP 協(xié)議及其他協(xié)議是否可使用更高的版本進(jìn)行通信,其參數(shù)值可以用來(lái)指定一個(gè)完全不同的通信協(xié)議。

上圖中,Upgrade字段值指定為 TLS/1.0。此時(shí)其字段產(chǎn)生作用的對(duì)象僅限于客戶端和鄰接服務(wù)器之間。
5. Via
Via 是為了追蹤客戶端與服務(wù)器之間的請(qǐng)求和響應(yīng)報(bào)文的傳輸路徑。
報(bào)文經(jīng)過(guò)代理或網(wǎng)關(guān)時(shí),會(huì)先在首部字段 Via 中附加該服務(wù)器的信息,然后在進(jìn)行轉(zhuǎn)發(fā)。
另外,該字段還可避免請(qǐng)求回環(huán)的發(fā)生。所以必須在經(jīng)過(guò)代理時(shí)附加該首部字段內(nèi)容。

6. Warning
該字段通常會(huì)告知用戶一些與緩存相關(guān)的問(wèn)題的警告。
其格式如下。最后的日期時(shí)間部分可省略。
Warning:[警告碼] [警告的主機(jī):端口號(hào)] "[警告內(nèi)容]" ([日期時(shí)間])
HTTP/1.1 警告碼
| 警告碼 | 警告內(nèi)容 | 說(shuō)明 |
|---|---|---|
| 110 | Response is stale(響應(yīng)已過(guò)期) | 代理返回已過(guò)期的資源 |
| 110 | Revalidation failed(再驗(yàn)證失?。?/td> | 代理再驗(yàn)證資源有效性時(shí)失效(服務(wù)器無(wú)法到達(dá)等原因) |
| 112 | Disconnection operation(斷開(kāi)連接操作) | 代理與互聯(lián)網(wǎng)連接被故意切斷 |
| 113 | Heuristic expiration(試探性過(guò)期) | 響應(yīng)的使用期超過(guò)24小時(shí)(有效緩存的設(shè)定時(shí)間大于24小時(shí)的情況下) |
| 199 | Miscellaneous warning(雜項(xiàng)警告) | 任意的警告內(nèi)容 |
| 214 | Transformation applied(使用了轉(zhuǎn)換) | 代理對(duì)內(nèi)容編碼或媒體類型等執(zhí)行了某些處理時(shí) |
| 299 | Miscellaneous persistent warning(持久雜項(xiàng)警告) | 任意的警告內(nèi)容 |