作者:李成文;
標(biāo)簽: http首部
HTTP報(bào)文首部
HTTP協(xié)議的請(qǐng)求和響應(yīng)報(bào)文中必定包含HTTP首部。首部內(nèi)容為客戶端和服務(wù)器分別處理請(qǐng)求和響應(yīng)提供所需要的信息。
HTTP請(qǐng)求報(bào)文:在請(qǐng)求中,HTTP報(bào)文由方法磕蒲、URI、HTTP版本只盹、HTTP首部字段等部分構(gòu)成辣往。
HTTP響應(yīng)報(bào)文:在響應(yīng)中,HTTP報(bào)文由HTTP版本殖卑、狀態(tài)碼站削、HTTP首部字段三部分構(gòu)成。
在這些字段中HTTP首部字段所包含的信息是最豐富的孵稽。
HTTP首部字段
HTTP首部字段中的信息
在HTTP通信的過程中许起,無論是請(qǐng)求還是響應(yīng)都會(huì)使用到首部字段十偶,它起到的作用是傳遞額外重要信息。
使用首部字段主要是為了給瀏覽器提供報(bào)文主體大小园细、所使用的語言惦积、認(rèn)證信息等內(nèi)容。
HTTP首部字段的結(jié)構(gòu)
HTTP首部字段是由字段名和字段值構(gòu)成的猛频,中間使用:
分隔狮崩。
例如,在HTTP首部中以Content-Type這個(gè)字段來表示報(bào)文主體的對(duì)象類型:
Content-Type: text/html
另外單個(gè)HTTP首部也可以有多個(gè)值鹿寻,如:
Keep-Alive: timeout=15, max=100
如果HTTP首部字段重復(fù)了睦柴,會(huì)根據(jù)瀏覽器內(nèi)部處理邏輯不同而不同,并沒有明確的規(guī)范毡熏,有些會(huì)優(yōu)先處理第一次出現(xiàn)的首部字段坦敌,有些則會(huì)優(yōu)先處理最后出現(xiàn)的首部字段。
4種HTTP首部字段類型
HTTP首部字段根據(jù)實(shí)際用途被分為4中類型:
-
通用首部字段
請(qǐng)求報(bào)文和響應(yīng)報(bào)文兩方都會(huì)使用通用的首部字段
-
請(qǐng)求首部字段
從客戶端向服務(wù)器端發(fā)送請(qǐng)求報(bào)文時(shí)使用的首部招刹。補(bǔ)充了請(qǐng)求的附加內(nèi)容、客戶端信息窝趣、響應(yīng)內(nèi)容相關(guān)優(yōu)先級(jí)等信息
-
響應(yīng)首部字段
從服務(wù)器向客戶端返回響應(yīng)報(bào)文時(shí)使用的首部疯暑。補(bǔ)充了響應(yīng)的附加內(nèi)容,也會(huì)要求客戶端附加額外的內(nèi)容信息哑舒。
-
實(shí)體首部字段
針對(duì)請(qǐng)求報(bào)文和響應(yīng)報(bào)文的實(shí)體部分使用的首部妇拯。補(bǔ)充了資源內(nèi)容更新時(shí)間等與實(shí)體有關(guān)的信息。
HTTP/1.1首部字段
HTTP/1.1規(guī)范了下面47種首部字段洗鸵。
通用首部字段:
首部字段名 | 說明 |
---|---|
Cache-Control | 控制緩存的行為 |
Connection | 逐跳首部越锈、連接的管理 |
Date | 創(chuàng)建報(bào)文的日期時(shí)間 |
Pragma | 報(bào)文指令 |
Trailer | 報(bào)文末端的首部一覽 |
Transfer-Encoding | 指定報(bào)文主體的傳輸編碼方式 |
Upgrade | 升級(jí)為其他協(xié)議 |
Via | 代理服務(wù)器的相關(guān)信息 |
Waring | 錯(cuò)誤通知 |
請(qǐng)求首部字段:
首部字段名 | 說明 |
---|---|
Accept | 用戶代理可處理的媒體類型 |
Accept-Charset | 優(yōu)先的字符集 |
Accept-Language | 優(yōu)先的語言 |
Authorization | Web認(rèn)證信息 |
Expect | 期待服務(wù)器的特定行為 |
From | 用戶的電子郵箱地址 |
Host | 請(qǐng)求資源所在的服務(wù)器 |
If-Match | 比較實(shí)體標(biāo)記 |
If-Modified-Since | 比較資源的更新時(shí)間 |
If-None-Match | 比較實(shí)體標(biāo)記 |
If-Range | 資源未更新時(shí)發(fā)送實(shí)體Byte的范圍請(qǐng)求 |
If-Unmodified-Since | 比較資源的更新時(shí)間 |
Max-Forwards | 最大傳輸逐跳數(shù) |
Proxy-Authorization | 代理服務(wù)器要求客戶端的認(rèn)證信息 |
Range | 實(shí)體字節(jié)范圍請(qǐng)求 |
Referer | 對(duì)請(qǐng)求中的URI的原始獲取方 |
TE | 傳輸編碼的優(yōu)先級(jí) |
User-Agent | HTTP客戶端程序的信息 |
響應(yīng)首部字段:
首部字段名 | 說明 |
---|---|
Accept-Ranges | 是否接受字節(jié)范圍請(qǐng)求 |
Age | 推算資源創(chuàng)建經(jīng)過時(shí)間 |
ETag | 資源的匹配信息 |
Location | 令客戶端重定向至指定的URI |
Proxy-Authenticate | 代理服務(wù)器對(duì)客戶端的認(rèn)證信息 |
Retry-After | 對(duì)再次發(fā)起請(qǐng)求的時(shí)機(jī)要求 |
Server | HTTP服務(wù)器的安裝信息 |
Vary | 代理服務(wù)器緩存的管理信息 |
WWW-Authenticate | 服務(wù)器對(duì)客戶端的認(rèn)證信息 |
實(shí)體首部字段:
首部字段名 | 說明 |
---|---|
Allow | 資源可支持的HTTP方法 |
Content-Encoding | 實(shí)體主體適用的編碼方式 |
Content-Language | 實(shí)體主體的自然語言 |
Content-Length | 實(shí)體主體的大小 |
Content-Location | 替代對(duì)應(yīng)資源的URI |
Content-MD5 | 實(shí)體主體的報(bào)文摘要 |
Content-Range | 實(shí)體主體的位置范圍 |
Content-Type | 實(shí)體主體的媒體類型 |
Expires | 實(shí)體主體過期的日期時(shí)間 |
Last-Modified | 資源的最后修改日期時(shí)間 |
非HTTP/1.1首部字段
在HTTP協(xié)議通信交互中使用到的首部字段不限于RFC2616中定義的47中首部字段。還有Cookie膘滨、set-Cookie和Content-Disposition等在其他RFC中定義的首部字段甘凭。
End-to-end首部和Hop-by-hop首部
HTTP首部字段將定義成緩存代理和非緩存代理的行為,分成兩個(gè)類型
端到端首部(End-to-end)
分在這個(gè)類別中的首部會(huì)轉(zhuǎn)發(fā)給請(qǐng)求/響應(yīng)對(duì)應(yīng)的最終接受目標(biāo)火邓,且必須保存在由緩存生成的響應(yīng)中丹弱,另外規(guī)定它必須被轉(zhuǎn)發(fā)。
逐跳首部(Hop-by-hop)
分在這個(gè)類別中的首部只對(duì)單次轉(zhuǎn)發(fā)有效铲咨,會(huì)因通過緩存或代理而不再轉(zhuǎn)發(fā)躲胳。HTTP/1.1和之后的版本中,如果要使用hop-by-hop首部纤勒,需要提供Connection首部字段坯苹。
下面列舉HTTP/1.1中逐跳首部字段。除了這8個(gè)首部字段之外摇天,其他的字段都是端到端首部粹湃。
- Connection
- Keep-Alive
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
HTTP/1.1通用首部字段
通用首部字段指的是恐仑,請(qǐng)求報(bào)文和響應(yīng)報(bào)文雙方都會(huì)使用的首部。
Cache-Control
通過指定首部字段Cache-Control的指令再芋,能夠操作緩存的工作機(jī)制菊霜。
指令的參數(shù)是可選的,多個(gè)指令之間通過“济赎,”分隔鉴逞,首部字段Cache-Control的指令可以用于請(qǐng)求及響應(yīng)時(shí)。
Cache-Control的指令可以按照請(qǐng)求和響應(yīng)分類司训,如下所示:
緩存請(qǐng)求指令:
指令 | 參數(shù) | 說明 |
---|---|---|
no-cache | 無 | 強(qiáng)制向源服務(wù)器再次驗(yàn)證 |
no-store | 無 | 不緩存請(qǐng)求或響應(yīng)的任何內(nèi)容 |
max-age=[秒] | 必需 | 響應(yīng)的最大Age值 |
max-stale(=[秒]) | 可省略 | 接受已過期的響應(yīng) |
min-fresh=[秒] | 必需 | 期望在指定時(shí)間內(nèi)的響應(yīng)任然有效 |
no-transform | 無 | 代理不可更改媒體類型 |
only-if-cached | 無 | 從緩存中獲取資源 |
cache-extension | - | 新指令標(biāo)記(token) |
緩存響應(yīng)指令:
指令 | 參數(shù) | 說明 |
---|---|---|
public | 無 | 可向任意方提供響應(yīng)的緩存 |
private | 可省略 | 僅向特定用戶返回響應(yīng) |
no-cache | 可省略 | 緩存前必須先確認(rèn)其有效性 |
no-store | 無 | 不緩存請(qǐng)求或響應(yīng)的任何內(nèi)容 |
no-transform | 無 | 代理不可更改媒體類型 |
must-revalidate | 無 | 可緩存但必須向源服務(wù)器再次進(jìn)行確認(rèn) |
proxy-revalidate | 無 | 要求中間緩存服務(wù)器對(duì)緩存的響應(yīng)有效性再進(jìn)行確認(rèn) |
max-age=[秒] | 必需 | 響應(yīng)最大Age值 |
s-maxage=[秒] | 必需 | 公共緩存服務(wù)器響應(yīng)的最大Age值 |
cache-extension | - | 新指令標(biāo)記(token) |
表示能否緩存的指令
public 指令
Cache-Control: public
當(dāng)使用public指令時(shí)构捡,明確的表明其他用戶也可以利用緩存。
private 指令
Cache-Control: private
當(dāng)指定private指令后壳猜,響應(yīng)只以特定的用戶作為對(duì)象勾徽,和public相反。
緩存服務(wù)器會(huì)對(duì)特定的用戶提供資源緩存服務(wù)统扳,對(duì)于其他用戶發(fā)送過來的請(qǐng)求喘帚,代理服務(wù)器不會(huì)返回緩存。
no-cache 指令
Cache-Control: no-cache
使用no-cache指令的目的是為了防止從緩存中返回過期的資源咒钟〈涤桑客戶端發(fā)送的請(qǐng)求如果包含no-cache指令,那么中間的緩存服務(wù)器必須把客戶端的請(qǐng)求發(fā)送給源服務(wù)器朱嘴。
如果服務(wù)器返回的響應(yīng)中包含了no-cache指令倾鲫,那么緩存服務(wù)器不能直接對(duì)資源進(jìn)行緩存。源服務(wù)器以后也將不再對(duì)緩存服務(wù)器請(qǐng)求中提出的資源有效性進(jìn)行確認(rèn)萍嬉,且禁止其對(duì)響應(yīng)資源進(jìn)行緩存操作乌昔。
由服務(wù)器返回的響應(yīng)中,若報(bào)文首部字段Cache-Control中對(duì)no-cache字段名具體指定參數(shù)值壤追,那么客戶端在接受到這個(gè)被指定參數(shù)值的首部字段對(duì)應(yīng)的響應(yīng)報(bào)文后磕道,就不能使用緩存,無參數(shù)值的首部字段可以使用緩存行冰。只能在響應(yīng)指令中指定該參數(shù)捅厂。
Cache-Control: no-cache=Location
控制可執(zhí)行緩存的對(duì)象的指令
no-store指令
Cache-Control: no-store
使用store指令時(shí),暗示請(qǐng)求或響應(yīng)中包含機(jī)密信息资柔,因此該指令規(guī)定緩存不能在本地存儲(chǔ)請(qǐng)求或響應(yīng)的任一部分焙贷。
指定緩存期限和認(rèn)證的指令
s-maxage指令
s-maxage指令的功能和max-age指令是一樣的,它們不同點(diǎn)在于s-maxage指令只適用于供多位用戶適用的公共緩存服務(wù)器贿堰。也就是說對(duì)于同一用戶重復(fù)返回響應(yīng)的服務(wù)器來說辙芍,這個(gè)指令沒有作用。
使用了s-maxage指令后,會(huì)直接忽略對(duì)Expires首部字段及max-age指令的處理
max-age指令
當(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í)徘层,緩存服務(wù)器將不對(duì)資源的有效性再作確認(rèn)峻呕,而max-age數(shù)值代表資源保存為緩存的最長時(shí)間。
應(yīng)用HTTP/1.1版本的緩存服務(wù)器遇到同時(shí)存在Expires首部字段的情況時(shí)趣效,會(huì)優(yōu)先處理max-age指令瘦癌,而忽略掉Expires首部字段,而HTTP/1.0版本的緩存服務(wù)器的情況相反跷敬,max-age指令會(huì)被忽略掉讯私。
min-fresh指令
min-fresh指令要求緩存服務(wù)器返回至少還未過指定時(shí)間的緩存資源。當(dāng)指定min-fresh未60秒后西傀,過來60秒的資源都無法作為響應(yīng)返回斤寇。
max-stale 指令
使用max-stale可指示緩存資源,即使過期也能照常接受拥褂。
如果沒有指定具體的參數(shù)值娘锁,那么無論過了多久,客戶端都會(huì)接受響應(yīng)肿仑,如果指令中指定了具體的參數(shù)數(shù)值致盟,那么即使過期了碎税,但是仍處于max-stale指定的時(shí)間內(nèi)尤慰,仍舊會(huì)被客戶端接受。
only-if-cached指令
使用only-if-cached指令表示客戶端僅在緩存服務(wù)器本地緩存目標(biāo)資源的情況下才會(huì)要求其返回雷蹂,該指令要求緩存服務(wù)器不重新加載響應(yīng)伟端,也不會(huì)再次確認(rèn)資源的有效性,如果發(fā)生請(qǐng)求緩存服務(wù)器的本地緩存無響應(yīng)匪煌,則會(huì)返回504 Gateway Timeout
must-revalidate 指令
使用must-revalidate指令责蝠,代理會(huì)向源服務(wù)器再次驗(yàn)證即將返回的響應(yīng)緩存是否任然有效。
如果緩存服務(wù)器無法連接源服務(wù)器再次獲取到有效資源萎庭,緩存必須給客戶端返回504狀態(tài)碼霜医,另外使用must-revalidate指令會(huì)忽略請(qǐng)求的max-stale指令。
proxy-revalidate 指令
proxy-revalidate 指令要求所有的緩存服務(wù)器在接受到客戶端帶有該指令的請(qǐng)求返回響應(yīng)之前驳规,必須再次驗(yàn)證緩存的有效性肴敛。
no-transform 指令
使用no-transform指令規(guī)定無論是在請(qǐng)求中還是在響應(yīng)中,緩存都不能改變實(shí)體主體的媒體類型
Cache-Control擴(kuò)展
cache-extension token
Cache-Control:private,community="UCI"
通過cache-extension標(biāo)記(token),可以擴(kuò)展Cache-Control首部字段內(nèi)的命令医男。如上例砸狞,Cache-Control首部字段并沒有community這個(gè)指令,但是借助extension tokens實(shí)現(xiàn)了這個(gè)指令的添加镀梭。這個(gè)指令只對(duì)能理解它的緩存服務(wù)器有意義刀森,不理解它的緩存服務(wù)器會(huì)直接忽略這個(gè)指令。
Connection
Connection首部字段具有兩個(gè)作用:
-
控制不再轉(zhuǎn)發(fā)給代理的首部字段
在客戶端發(fā)送請(qǐng)求和服務(wù)器返回響應(yīng)內(nèi)报账,使用Connection首部字段研底,可以控制不再轉(zhuǎn)發(fā)給代理的首部字段,即Hop-by-hop首部笙什,添加了之后代理服務(wù)器將請(qǐng)求或響應(yīng)轉(zhuǎn)發(fā)給服務(wù)器或客戶端的時(shí)候就會(huì)忽略掉Connection里面的首部字段飘哨。
Connection:不再轉(zhuǎn)發(fā)的首部字段名
- 管理持久連接
Connection:close
HTTP/1.1版本的默認(rèn)連接都是持久連接,客戶端會(huì)在持久連接上連續(xù)發(fā)送請(qǐng)求琐凭,當(dāng)服務(wù)器端想明確斷開連接時(shí)芽隆,可以指定Connection首部字段的值為close。
Connection: Keep-Alive
HTTP/1.1之前的版本默認(rèn)連接時(shí)非持久連接统屈,如果想在舊版本的HTTP協(xié)議上使用持久連接胚吁,那么可以指定Connection首部字段的值為Keep-Alive。
Date
首部字段Date表明創(chuàng)建HTTP報(bào)文的日期和時(shí)間愁憔。
Pragma
Pragma是HTTP/1.1之前版本的歷史遺留字段腕扶,僅僅作為與HTTP/1.0的向后兼容而定義。
這個(gè)字段屬于通用首部字段吨掌,但是只用在客戶端發(fā)送的請(qǐng)求當(dāng)中半抱,客戶端會(huì)要求所有的中間服務(wù)器不返回緩存資源。
如果所有的中間服務(wù)器都是以HTTP/1.1為基準(zhǔn)膜宋,那么直接使用Cache-Control:no-cache指定緩存的處理即可窿侈,但是有些老的中間服務(wù)器不是以HTTP/1.1,那么如果想要兼容所有的中間服務(wù)器就需要加上Pragma:no-cache
Cache-Control: no-cache
Pragma: no-cache
Trailer
首部字段Trailer會(huì)事先說明在報(bào)文主體后記錄了那些首部字段秋茫,該首部字段可應(yīng)用在HTTP/1.1版本分塊傳輸編碼時(shí)史简。
HTTP/1.1 200 OK
Date: Tue, 03 JUl 2018 09:34:34 GMT
Content-Type: text/html
...
Trailer: Expires
...(報(bào)文主體)...
0
Expires: Tue, 23 sep 2017 23:34:43 GMT
上面的例子,指定首部字段Trailer的值為Expires肛著,在報(bào)文主體之后出現(xiàn)了首部字段Expires圆兵。
Transfer-Encoding
Transfer-Encoding規(guī)定了傳輸報(bào)文主體時(shí)采用的編碼方式。
Upgrade
Upgrade用來檢測(cè)HTTP協(xié)議及其他協(xié)議是否可使用更高版本進(jìn)行通信枢贿,參數(shù)值可以用來指定一個(gè)完全不同的通信協(xié)議
GET /index.html HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade
在上面的報(bào)文中殉农,首部字段Upgrade指定的值為TLS/1.0。Connection的值被指定為Upgrade局荚。也就是說Upgrade首部字段產(chǎn)生作用的Upgrade對(duì)象僅限于客戶端和鄰接服務(wù)器之間超凳。所以在使用Upgrade時(shí),還需要指定Connection:Upgrade
對(duì)于附有首部字段Upgrade的請(qǐng)求,服務(wù)器可以使用101 Switching Protocols 狀態(tài)碼作為響應(yīng)返回聪建。
Via
使用首部字段Via是為了追蹤客戶端與服務(wù)器之間的請(qǐng)求和響應(yīng)報(bào)文的傳輸路徑钙畔。
報(bào)文在經(jīng)過代理或網(wǎng)關(guān)時(shí),會(huì)先在首部子段Via中附加該服務(wù)器的信息金麸,然后再進(jìn)行轉(zhuǎn)發(fā)擎析。
Warning
該首部通常會(huì)告知用戶一些與緩存相關(guān)的問題的警告。
Waring首部的格式如下挥下。最后的日期時(shí)間可以省略揍魂。
Warning:[警告碼][警告主機(jī):端口號(hào)]"[警告內(nèi)容]"([日期時(shí)間])
請(qǐng)求首部字段
請(qǐng)求首部字段是從客戶端往服務(wù)端發(fā)送請(qǐng)求報(bào)文中所使用的字段,用于補(bǔ)充請(qǐng)求的附加信息棚瘟、客戶端信息现斋、對(duì)響應(yīng)內(nèi)容相關(guān)的優(yōu)先級(jí)等內(nèi)容
Accept
Accept字段用來告訴服務(wù)器,用戶代理能夠處理的媒體類型以及媒體類型的相對(duì)優(yōu)先級(jí)偎蘸∽#可以使用type/subtype這種形式,一次指定多種媒體類型迷雪。
Accept:text/html,application/xhtml+xml,application/xml;q=0
下面是幾種常見的媒體類型:
- 文本文件
text/html,text/plain,text/css...
application/xhtml+xml,application/xml...
- 圖片文件
image/jpeg, image/gif, image/png
- 視頻文件
video/mpeg, video/quicktime
- 應(yīng)用程序使用的二進(jìn)制文件
application/octet-stream,application/zip...
如果瀏覽器不支持PNG圖片的顯示限书,那么Accept就不指定image/png。
如果想要給顯示的媒體類型增加優(yōu)先級(jí)章咧,可以使用q=來額外表示權(quán)重值倦西,用分號(hào)(;)進(jìn)行分隔。權(quán)重q的范圍是0~1赁严,且1是最大值扰柠。不指定權(quán)重q值時(shí),默認(rèn)權(quán)重q=1.0疼约。當(dāng)服務(wù)器可以提供多種內(nèi)容時(shí)卤档,會(huì)首先返回權(quán)重值最高的媒體類型。
Accept-Charset
Accept-Charset首部字段可以用來通知服務(wù)器用戶代理支持的字符集及字符集的相對(duì)優(yōu)先順序忆谓。另外裆装,可一次性指定多種字符集踱承。與首部字段Accept相同的是可以用權(quán)重q值來表示相對(duì)優(yōu)先級(jí)倡缠。
Accept-Charset: iso-8859, unicode-1-1;q=0.8
Accept-Encoding
Accept-Encoding首部字段用來告知服務(wù)器用戶代理支持的內(nèi)容編碼及內(nèi)容編碼的優(yōu)先級(jí)順序,可以使用權(quán)重q值來表示相對(duì)優(yōu)先級(jí)茎活,也可以使用(*)作為通配符昙沦,指定任意的編碼格式。
Accept-Encoding:gzip,deflate
下面是幾種常見的內(nèi)容編碼:
- gzip
- compress
- deflate
- identity
Accept-Language
用來告訴服務(wù)器用戶代理能夠處理的自然語言集载荔,以及自然語言集的相對(duì)優(yōu)先級(jí)盾饮。可以一次指定多種自然語言集,用q來表示相對(duì)權(quán)重丘损。
Authorization
Authorization是用來告知服務(wù)器普办,用戶代理的認(rèn)證信息。通常想要通過服務(wù)器認(rèn)證的用戶代理會(huì)在接受到返回的401狀態(tài)碼響應(yīng)后徘钥,把首部字段Authorization加入請(qǐng)求中衔蹲。
Expect
客戶端使用功能首部字段Expect來告知服務(wù)器,期望出現(xiàn)的某種特定行為呈础。因?yàn)榉?wù)器無法理解客戶端的期望做出回應(yīng)而發(fā)生錯(cuò)誤時(shí)舆驶,會(huì)返回狀態(tài)碼417 Expectation Failed
客戶端利用該首部字段,寫明所期望的擴(kuò)展而钞。
From
首部字段Form用來告知服務(wù)器使用用戶代理的用戶的電子郵件地址沙廉。
Host
首部字段Host會(huì)告知服務(wù)器,請(qǐng)求的資源所在的互聯(lián)網(wǎng)主機(jī)名和端口號(hào)臼节。當(dāng)請(qǐng)求被發(fā)送至服務(wù)器是撬陵,請(qǐng)求中的主機(jī)名會(huì)用IP地址直接替換,那么如果在相同的IP下面部署了多個(gè)域名网缝,服務(wù)器將會(huì)無法理解究竟是哪個(gè)域名所對(duì)應(yīng)的請(qǐng)求袱结,這種情況下,必須使用Host字段來告訴服務(wù)器請(qǐng)求的主機(jī)名途凫,如果服務(wù)器沒有設(shè)定主機(jī)名垢夹,那么直接發(fā)送一個(gè)空值就可以了。
If-Match
形如If-xxx這種樣式的請(qǐng)求首部字段维费,都可以稱為條件請(qǐng)求果元。服務(wù)器接受到附帶條件的請(qǐng)求后,只有判斷指定條件為真的時(shí)候才會(huì)執(zhí)行請(qǐng)求犀盟。
If-Match: "123456
這里首部字段If-Match而晒,會(huì)告訴服務(wù)器匹配資源所用的實(shí)體標(biāo)記(ETag)值,服務(wù)器會(huì)對(duì)比If-Match的字段值和資源的ETag值阅畴,只有當(dāng)兩者一致的時(shí)候倡怎,才會(huì)執(zhí)行請(qǐng)求。反之贱枣,則會(huì)返回412 Precondition Failed的響應(yīng)监署。
可以使用星號(hào)(*)指定If-Match的字段值,這種情況下纽哥,服務(wù)器會(huì)忽略ETag的值钠乏。
If-Range
If-Range屬于附帶條件之一,它告訴服務(wù)端如果指定的If-Range字段值(ETag值或時(shí)間)和請(qǐng)求資源的ETag值或時(shí)間一直時(shí)春塌,就做范圍請(qǐng)求處理晓避,否則會(huì)返回全體資源簇捍。
如果不是用If-Range發(fā)送送請(qǐng)求的情況是怎么樣的呢?服務(wù)器的資源如果更新了俏拱,那么客戶端持有的一部分資源就會(huì)隨之失效暑塑,那么范圍請(qǐng)求就是無效的,服務(wù)器會(huì)返回412 Precondition Failed的響應(yīng)锅必,告訴客戶端需要再發(fā)一次請(qǐng)求梯投,而使用If-Range則不會(huì)。
Max-Forwards
使用TRACE方法或者OPTIONS方法况毅,發(fā)送包含首部字段Max-Forwards的請(qǐng)求時(shí)分蓖,這個(gè)字段以十進(jìn)制的整數(shù)來指定可以經(jīng)過的服務(wù)器的最大數(shù)目。服務(wù)器在往下一個(gè)服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求之前Max-Forwards的值減一然后會(huì)重新賦值尔许,當(dāng)服務(wù)器收到的Max-Forwards的值為0的時(shí)候請(qǐng)求就不會(huì)再進(jìn)行轉(zhuǎn)發(fā)么鹤,而是直接返回響應(yīng)。
在使用HTTP協(xié)議通信時(shí)味廊,請(qǐng)求可能會(huì)經(jīng)過多個(gè)代理服務(wù)器蒸甜。途中,如果代理服務(wù)器由于某些原因?qū)е抡?qǐng)求轉(zhuǎn)發(fā)失敗余佛,客戶端就接收不到服務(wù)器的響應(yīng)了柠新,而使用Max-Forwards字段,可以針對(duì)這個(gè)問題進(jìn)行排查辉巡,由于Max-Forwards的值為0的時(shí)候恨憎,請(qǐng)求就會(huì)返回,那么我們就可以通過這個(gè)字段來對(duì)請(qǐng)求傳輸?shù)穆窂接兴盐铡?/p>
Proxy-Authorization
接受到代理服務(wù)器發(fā)來的認(rèn)證質(zhì)詢時(shí)郊楣,客戶端會(huì)發(fā)送包含首部字段Proxy-Authorization的請(qǐng)求憔恳,告訴服務(wù)器認(rèn)證所需要的信息。
這個(gè)和客戶端與服務(wù)器之間的HTTP訪問認(rèn)證類似净蚤,不同的地方在于钥组,認(rèn)證行為發(fā)生在客戶端與代理之間。
Range
進(jìn)行范圍請(qǐng)求時(shí)通過這個(gè)字段告訴服務(wù)器請(qǐng)求的范圍今瀑,接受到附帶Range字段的請(qǐng)求的服務(wù)器程梦,會(huì)在處理請(qǐng)求之后返回206 Partial Content 的響應(yīng)。 無法處理該范圍請(qǐng)求的時(shí)候橘荠,就會(huì)返回狀態(tài)碼200 OK 并且將所有的資源全部返回屿附。
Referer
Referer會(huì)告訴服務(wù)器請(qǐng)求的原始資源URI。
TE
TE會(huì)告知服務(wù)器客戶端能夠處理的傳輸編碼方式砾医,以及優(yōu)先級(jí)(使用q來表示優(yōu)先級(jí))拿撩,它和Accept-Encoding的功能很像衣厘,但是用于傳輸編碼如蚜。
User-Agent
User-Agent會(huì)將創(chuàng)建請(qǐng)求的服務(wù)器和用戶代理的名稱等信息傳達(dá)給服務(wù)器压恒。
響應(yīng)首部字段
響應(yīng)首部字段是由服務(wù)器發(fā)送給客戶端的響應(yīng)報(bào)文中所使用的字段。
Accept-Ranges
Accept-Ranges用來告訴客戶端服務(wù)器是否能處理范圍請(qǐng)求错邦,以指定獲取服務(wù)器端某個(gè)部分的資源探赫。可以指定的字段的值有兩種撬呢,可處理范圍請(qǐng)求時(shí)指定為bytes伦吠,否則指定為none。
Age
Age告訴客戶端魂拦,源服務(wù)器在多久前創(chuàng)建了響應(yīng)毛仪,單位是秒。
如果創(chuàng)建響應(yīng)的服務(wù)器是緩存服務(wù)器芯勘,Age的值是指緩存后的響應(yīng)再次發(fā)起認(rèn)證到認(rèn)證完成的時(shí)間值箱靴,代理創(chuàng)建響應(yīng)時(shí)必須加上首部字段Age。
Etag
Etag告訴客戶端實(shí)體標(biāo)記荷愕,它時(shí)一種可以將資源以字符串形式做唯一表示的方式衡怀。服務(wù)器會(huì)為每份資源分配對(duì)應(yīng)的Etag值,當(dāng)資源更新時(shí)安疗,Etag值也需要更新抛杨,生成Etag值時(shí),并沒有統(tǒng)一算法規(guī)則荐类,由服務(wù)器來分配怖现。
資源被緩存時(shí),會(huì)被分配唯一性標(biāo)識(shí)玉罐。如當(dāng)使用中文版瀏覽器訪問goole首頁時(shí)真竖,服務(wù)器返回的是中文的goole首頁,而使用英文版的訪問的時(shí)候就會(huì)返回英文版的首頁厌小。兩者的URI是完全相同的恢共,所以僅僅是憑著URI指定緩存的資源是非常困難的,如果在下載過程中出現(xiàn)連接中斷璧亚、再次連接的情況讨韭,都會(huì)依照ETag值來指定資源。
ETag值分為強(qiáng)ETag值和弱ETag值癣蟋。
強(qiáng)ETag值透硝,不論實(shí)體發(fā)生多么微小的變化都會(huì)改變他的值。
ETag: "usagi-1234"
弱ETag值疯搅,只用于提示資源是否相同濒生。只有資源發(fā)生了根本的改變,產(chǎn)生差異是才會(huì)改變ETag值幔欧,這個(gè)時(shí)候會(huì)在字段開始附加W/罪治。
Location
使用首部字段Location可以將響應(yīng)接受方引導(dǎo)至某個(gè)與請(qǐng)求URI位置不同的資源丽声,一般這個(gè)字段會(huì)配合3XX:Redirection的響應(yīng),提供重定向觉义。
Proxy-Authenticate
Proxy-Authenticate字段會(huì)把由服務(wù)器所要求的認(rèn)證信息發(fā)送給客戶端雁社。
Retry-After
Retry-After告訴客戶端應(yīng)該在多久之后再次發(fā)送請(qǐng)求。主要配合狀態(tài)碼503 Service Unavailable 響應(yīng)晒骇,或3XX Redirect響應(yīng)一起使用霉撵。
字段的值可以是具體的日期時(shí)間,也可以是創(chuàng)建響應(yīng)后的毫秒數(shù)洪囤。
Server
Server告訴客戶端當(dāng)前服務(wù)器上安裝的HTTP服務(wù)器應(yīng)用程序的信息徒坡。
Vary
Vary的作用是對(duì)緩存進(jìn)行控制,源服務(wù)器會(huì)向代理服務(wù)器傳達(dá)關(guān)于本地緩存使用方法的命令瘤缩。
從代理服務(wù)器接受到源服務(wù)器返回包含Vary指定項(xiàng)的響應(yīng)之后崭参,若再要進(jìn)行緩存,僅對(duì)請(qǐng)求中包含相同Vary指定首部字段的請(qǐng)求返回緩存款咖。即使是對(duì)相同資源發(fā)起請(qǐng)求何暮,但是如果Vary指定的首部字段不相同,也必須要從源服務(wù)器重新獲取資源铐殃。
例如:當(dāng)代理服務(wù)器收到帶有Vary首部字段指定獲取資源的請(qǐng)求時(shí)海洼,如果使用的Accept-Language字段的值相同,那么直接從緩存中返回響應(yīng)富腊。反之需要從源服務(wù)器端獲取資源后才能作為響應(yīng)返回坏逢。
WWW-Authenticate
WWW-Authenticate用于HTTP訪問認(rèn)證。它會(huì)告知客戶端適用于訪問請(qǐng)求URI所指定的認(rèn)證方案(Basic和Digest)和帶參數(shù)提示的質(zhì)詢赘被。
實(shí)體首部字段
實(shí)體首部字段是包含在請(qǐng)求報(bào)文和響應(yīng)報(bào)文中的實(shí)體部分所使用的首部是整,用于補(bǔ)充內(nèi)容的更新時(shí)間等于實(shí)體相關(guān)的信息。
Allow
Allow用于通知客戶端能夠支持Request-URI指定資源的所有HTTP方法民假。當(dāng)服務(wù)器接受到不支持HTTP方法時(shí)浮入,會(huì)以405 Not Allowed 作為響應(yīng)返回,并且把所有支持的方法寫入首部字段Allow羊异。
Content-Encoding
Content-Encoding會(huì)告知客戶端服務(wù)器對(duì)實(shí)體的主體部分采用的編碼方式事秀,編碼方式指的是在不丟失實(shí)體信息的前提下所進(jìn)行的壓縮。
Content-Language
Content-Language告知客戶端野舶,實(shí)體主體所采用的自然語言易迹。
Content-Length
Content-Length表明實(shí)體主體部分的大小。對(duì)實(shí)體主體進(jìn)行內(nèi)容編碼傳輸時(shí)平道,不能再使用Content-Length首部字段睹欲。
Content-Location
Content-Location給出報(bào)文主體部分相對(duì)應(yīng)的URI。
Content-MD5
Content-MD5是一串由MD5算法生成的值一屋,用于檢查主體在傳輸過程中是否保存完整窘疮,以及確認(rèn)傳輸?shù)竭_(dá)袋哼。
Content-Range
針對(duì)范圍請(qǐng)求,返回響應(yīng)時(shí)使用的首部字段Content-Range考余,能告知客戶端作為響應(yīng)返回的實(shí)體的那部分符合范圍請(qǐng)求先嬉。字段值以字節(jié)為單位轧苫,表示當(dāng)前發(fā)送部分及整體實(shí)體大小楚堤。
Content-Range:bytes 5001-10000/10000
Content-Type
Content-Type說明了實(shí)體主體內(nèi)對(duì)象的媒體類型。
Expires
Expires會(huì)將資源的失效日期告知客戶端含懊,緩存服務(wù)器在接受到含有首部字段Expires字段值指定的時(shí)間之前身冬,響應(yīng)的副本會(huì)被一直保存,當(dāng)超過指定的時(shí)間之后岔乔,緩存服務(wù)器在請(qǐng)求發(fā)送過來之后會(huì)轉(zhuǎn)向源服務(wù)器請(qǐng)求資源酥筝。
Last-Modified
Last-Modified指明資源最終修改的時(shí)間。
為Cookie服務(wù)的首部字段
Cookie用來管理客戶端和服務(wù)器之間的狀態(tài)雏门,Cookie的工作機(jī)制是用戶識(shí)別及狀態(tài)管理嘿歌。
Set-Cookie
當(dāng)服務(wù)器準(zhǔn)備開始管理客戶端的狀態(tài)時(shí),會(huì)事先告知各種信息茁影,下面介紹一下Set-Cookie字段的屬性值:
expires
expires屬性指定瀏覽器可發(fā)送Cookie的有效期宙帝。當(dāng)省略這個(gè)屬性,有效期限僅限于位置瀏覽器會(huì)話時(shí)間段內(nèi)募闲。
一旦Cookie從服務(wù)器發(fā)送至客戶端步脓,服務(wù)器就不存在可以顯示刪除Cookie的方法,但是可以通過覆蓋已經(jīng)過期的Cookie浩螺,實(shí)現(xiàn)對(duì)客戶端Cookie的實(shí)質(zhì)性刪除靴患。
path
Cookie的path屬性可以用來限制指定的Cookie的發(fā)送范圍的文件目錄。
domain
通過Cookie的domain屬性指定的域名可做到與結(jié)尾匹配一致要出。
secure
Cookie的secure屬性用于限制Web頁面僅在HTTPS安全連接時(shí)鸳君,才可以發(fā)送Cookie。當(dāng)省略secure屬性時(shí)患蹂,不論HTTP還是HTTPS相嵌,都會(huì)對(duì)Cookie進(jìn)行回收。
Set-Cookie:name="value"; secure
HttpOnly
Cookie的HttpOnly屬性時(shí)Cookie的擴(kuò)展功能况脆,它使JavaScript腳本無法獲得Cookie饭宾。主要的目的是為了防止跨站腳本攻擊對(duì)Cookie的信息竊取。
Cookie
首部字段Cookie會(huì)告知服務(wù)器格了,當(dāng)客戶端想獲得HTTP狀態(tài)管理支持時(shí)看铆,就會(huì)在請(qǐng)求中包含從服務(wù)器接受到的Cookie。接受到多個(gè)Cookie時(shí)盛末,同樣可以以多個(gè)Cookie形式發(fā)送弹惦。
其他首部字段
HTTP首部字段是可以自行擴(kuò)展的否淤,下面介紹幾個(gè)最常用的首部字段。
X-Frame-Options
首部字段X-Frame-Options屬于HTTP響應(yīng)首部棠隐,用于控制網(wǎng)站內(nèi)容在其他Web網(wǎng)站的Frame標(biāo)簽內(nèi)的顯示問題石抡。主要目的是為了防止點(diǎn)擊劫持攻擊。
首部字段X-Frame-Options有兩個(gè)可指定的值:
- DENY:拒絕
- SAMEORIGIN:僅同源域名下的頁面匹配時(shí)許可助泽。
X-XSS-Protection
X-XSS-Protection屬于HTTP響應(yīng)首部啰扛,它是針對(duì)跨站腳本攻擊(XSS)的一種對(duì)策,用于控制瀏覽器XSS防護(hù)機(jī)制的開關(guān)嗡贺。
字段值如下:
- 0:將XSS過濾設(shè)置成無效狀態(tài)
- 1:將XSS過濾設(shè)置成有效狀態(tài)
DNT
屬于HTTP請(qǐng)求首部隐解,DNT是Do Not Track 的簡(jiǎn)稱,意思是拒絕個(gè)人信息被收集诫睬,表示拒絕被精準(zhǔn)廣告追蹤的一種方法煞茫。
字段值如下:
- 0:同一被追蹤
- 1:拒絕被追蹤
P3P
屬于HTTP響應(yīng)首部,通過利用P3P技術(shù)摄凡,可以讓W(xué)eb網(wǎng)站上的個(gè)人隱私變成一種僅供程序理解的形式续徽,以達(dá)到保護(hù)用戶隱私的目的。
具體內(nèi)容請(qǐng)參考其他資料