目標(biāo)
首部的結(jié)構(gòu)
首部中各字段的用法
HTTP報文首部

HTTP協(xié)議的請求和響應(yīng)報文中必定包含HTTP首部,對于客戶的來說,這些信息的大部分內(nèi)容都無須親自查看。
HTTP請求報文

下面是訪問http://hackr.jp時的報文

HTTP響應(yīng)報文

以下是請求http://hackr.jp/時返回的響應(yīng)報文首部信息

HTTP首部字段
HTTP首部字段傳遞重要信息
使用首部字段是為了給瀏覽器和服務(wù)器提供報文主體大小,所使用的語言,認(rèn)真信息等內(nèi)容

HTTP首部字段結(jié)構(gòu)
首部字段名:字段值
如:報文主體對象類型
Content-Type:text/html
字段值對應(yīng)單個HTTP首部字段可以有多個值,如
Keep-Alive:timeout=15, max=100
若HTTP首部字段重復(fù)了如何
根據(jù)瀏覽器的不同,處理情況可能不能,有些瀏覽器優(yōu)先處理第一次出現(xiàn)的首部字段,而有些則會優(yōu)先處理最后出現(xiàn)的首部字段。
4種HTTP首部字段類型
- 通用首部字段:General Header Fields
? 請求報文和響應(yīng)報文兩方都會使用的首部。
- 請求首部字段:Request Header Fields
? 客戶端發(fā)送請求報文給服務(wù)器時使用,補(bǔ)充了請求的附加內(nèi)容,客戶端信息,響應(yīng)內(nèi)容相關(guān)的優(yōu)先級等信息
- 響應(yīng)首部字段:Response Header Fields
? 服務(wù)器向客戶端返回響應(yīng)報文時使用的首部,補(bǔ)充響應(yīng)的附加內(nèi)容,也會要求客戶端附加額外的內(nèi)容信息。
- 實(shí)體首部字段:Entity header Fields
? 針對請求報文和響應(yīng)報文的實(shí)體部分使用的首部。補(bǔ)充了資源內(nèi)容更新時間等與實(shí)體有關(guān)的信息。
HTTP/1.1首部字段一覽
47種首部字段




非HTTP/1.1首部字段
在HTTP協(xié)議中不限于RFC2616中的47種首部字段,還有Cookie,Set-Cookie和Content-Disposition等其他RFC中定義的首部字段。
End-to-end首部和Hop-by-hop首部
HTTP首部字段將定義成緩存代理和非緩存代理的行為,分為2種類型。
- 端到端首部(End-to-end Header)
? 分在此類別中的首部會轉(zhuǎn)發(fā)給請求/響應(yīng)對應(yīng)的最終接受目標(biāo),且必須保存在由緩存生成的響應(yīng)中,另外規(guī)定它必須被轉(zhuǎn)發(fā)。
- 逐跳首部(Hop-by-hop Header)
? 分在此類別中的首部只對單次轉(zhuǎn)發(fā)有效,會因通過緩存或代理而不再轉(zhuǎn)發(fā)。HTTP/1.1和之后版本中,如果要使用hop-by-hop首部,需提供Connection首部字段
? 下列字段首部字段,其他所有字段都端到端首部
Connection/Keep-Alive/Proxy-Authenticate/Proxy-Authorization/Trailer/TE/Transfer-Encoding/Upgrade
HTTP/1.1通用首部字段
Cache-Control
通過指定首部字段Cache-Control的指令,就能操作緩存的工作機(jī)制。
指令的參數(shù)是可選的,多個指令之間通過“,”分隔,首部字段Cache-Control可用于請求何響應(yīng)時。
Cache-Control: private, max-age=0, no-cache

public
當(dāng)指定public指令時,則明確表明其他用戶也可以利用緩存
private
當(dāng)指定private指令后,響應(yīng)只以特定的多用戶作為對象,這與public指令的行為相反
no-cache
為了防止從緩存中返回過期的資源
客戶端發(fā)送請求中如果包含no-cache指令,則表示客戶端將不會接收緩存過的響應(yīng),于是,“中間”的緩存服務(wù)器必須把客戶端請求轉(zhuǎn)發(fā)給源服務(wù)器。
如果服務(wù)器返回的響應(yīng)中包含no-cache指令,那么緩存服務(wù)器不能對資源進(jìn)行緩存,源服務(wù)器以后也將不再對緩存服務(wù)器請求中提出的資源有效性進(jìn)行確認(rèn),且禁止其對響應(yīng)資源進(jìn)行緩存操作。
Cache-Control: no-cache=Location
由服務(wù)器返回的響應(yīng)中,若報文首部字段Cache-Control中對no-cache 字段名具體指定參數(shù)值,那么客戶端就在接收到服務(wù)器這個被指定參數(shù)值,那么客戶端在接收到這個被指定參數(shù)值的首部字段對應(yīng)的響應(yīng)報文后,就不能使用緩存了。無參數(shù)值的首部字段可以使用緩存。
控制可執(zhí)行緩存的對象的指令
no-store
暗示請求(和對應(yīng)的響應(yīng))或響應(yīng)中包含機(jī)密信息。因此該指令規(guī)定緩存不能存儲在本地存儲請求或者響應(yīng)的任一部分。
注意 : no-cache代表不緩存過期的資源,緩存會向源服務(wù)器進(jìn)行有效期確認(rèn)后處理資源。no-store才是真正地不進(jìn)行緩存。
指定緩存期限和認(rèn)證的指令
s-maxage
Cache-Control: s-maxage=604800(單位:秒)
s-maxage指令的功能和max-age指令的相同,不同點(diǎn)是:前者只適用于供多用戶使用的公共緩存服務(wù)器。對于同一用戶重復(fù)返回響應(yīng)的服務(wù)器來說,這個指令沒有任何作用。
另外,當(dāng)使用s-maxage指令后,則直接忽略對Expires首部字段及max-age指令的處理。
max-age
Cache-Control: max-age=604800(單位:秒)
當(dāng)客戶端發(fā)送的請求中包含max-age指令時,如果判定緩存資源的緩存時間數(shù)值比指定時間數(shù)值更小,那么客戶端就接收緩存的資源。另外,當(dāng)指定max-age=0,那么緩存服務(wù)器通常需要將請求轉(zhuǎn)發(fā)給源服務(wù)器。
當(dāng)服務(wù)器返回的響應(yīng)中包含max-age指令時,緩存服務(wù)器將不對資源的有效性再做確認(rèn),而max-age數(shù)值代表資源保存為緩存的最長時間。
HTTP/1.1版本中,max-age與Expires共存,忽略掉Expires,1.0版本忽略掉max-age
min-fresh
Cache-Control:min-fresh=60(單位秒)
要求緩存服務(wù)器返回至少還未過指定時間的緩存資源
max-stale
Cache-Control: max-stale=3600(單位秒)
指示緩存資源即使過期也照常接收。
如果指令未指定參數(shù)值,那么無論經(jīng)歷多久,客戶端都會接收響應(yīng),如果指令中指定了具體的數(shù)值,那么即使過期,只要礽處于mas-stale指定的時間內(nèi),仍舊會被客戶端接收。
only-if-cached
客戶端僅在緩存服務(wù)器本地緩存目標(biāo)資源的情況下才會要求其返回。該指令要求緩存服務(wù)器不重新加載響應(yīng)。也不會再次確認(rèn)資源的有效性。若發(fā)生請求緩存服務(wù)器的本地緩存無響應(yīng),返回狀態(tài)碼504
must-revalidate
代理會向源服務(wù)器再次驗證即將返回的響應(yīng)緩存目前是否仍然有效。若代理無法聯(lián)通源服務(wù)器再次獲取有效數(shù)據(jù)的話,緩存必須給客戶端一條504狀態(tài)碼,另外,他會忽略max-stale指令。
proxy-revalidate
要求所有的緩存服務(wù)器在接收到客戶端帶有該指令的請求返回響應(yīng)之前必須再次驗證緩存的有效性
no-transform
規(guī)定無亂是在請求還是響應(yīng)中,緩存都不能改變實(shí)體主體的媒體類型。