五、與HTTP協(xié)作的web服務(wù)器
- HTTP/1.1 規(guī)范允許一臺HTTP服務(wù)器搭建多個(gè)web站點(diǎn),即在相同IP地址下,由于虛擬主機(jī)可以寄存多個(gè)不同主機(jī)名和域名的網(wǎng)站。因此發(fā)送HTTP請求時(shí),必須在Host首部內(nèi)完整指定主機(jī)名或域名的URI
- 通信數(shù)據(jù)轉(zhuǎn)發(fā)程序:
- 代理:一種有轉(zhuǎn)發(fā)功能的應(yīng)用程序,扮演著服務(wù)器與客戶端的“中間人”。
- 基本行為:不改變請求URI,直接轉(zhuǎn)發(fā)。
- 轉(zhuǎn)發(fā)時(shí),需要附加Via首部字段以標(biāo)記出經(jīng)過的主機(jī)信息。
- 代理按兩種基準(zhǔn)分類。一種:是否使用緩存,另一種:是否修改報(bào)文。(緩存代理、透明代理)
- 緩存代理:代理轉(zhuǎn)發(fā)時(shí),緩存代理會(huì)預(yù)先將資源緩存在代理服務(wù)器上。
- 透明代理:轉(zhuǎn)發(fā)請求或響應(yīng)式,不對報(bào)文做任何加工的代理。反之,稱為非透明代理。
- 網(wǎng)關(guān):轉(zhuǎn)發(fā)其他服務(wù)器通信數(shù)據(jù)的服務(wù)器。接收從客戶端發(fā)來的請求時(shí),它就像自己擁有資源的原服務(wù)器一樣對請求進(jìn)行處理
- 工作機(jī)制與代理相似,區(qū)別在于:網(wǎng)關(guān)能使通信線路上的服務(wù)器提供非HTTP協(xié)議服務(wù)
- 利用網(wǎng)關(guān)提高通信的安全性,因?yàn)榭梢栽诳蛻舳伺c網(wǎng)關(guān)之間的通信新路上加密以確保連接的安全。
- 隧道:可按要求建立起一條與其他服務(wù)器的通信線路,屆時(shí)使用SSL等加密手段進(jìn)行通信。
- 目的是確保客戶端能與服務(wù)器進(jìn)行安全的通信。
- 隧道本身不會(huì)去解析HTTP請求。
六、HTTP首部
- 請求報(bào)文首部
- 請求行(方法、URI、HTTP版本)
- 請求首部字段
- 通用首部字段
- 實(shí)體首部字段
- 其他
- 響應(yīng)報(bào)文首部
- 狀態(tài)行(HTTP版本、狀態(tài)碼)
- 響應(yīng)首部字段
- 通用首部字段
- 實(shí)體首部字段
- 其他
- 首部字段結(jié)構(gòu)
- 字段名和字段值構(gòu)成,中間用冒號
Content-Type: text/html
- 字段值對應(yīng)單個(gè)HTTP首部字段可以有多個(gè)值
Keep-Alive: timeout=15, max=100
- End-to-end 首部和Hop-by-hop 首部
-
端到端首部(End-to-end Header)
分在此類別中的首部回轉(zhuǎn)發(fā)給請求/響應(yīng)對應(yīng)的最終接收目標(biāo),且必須保存在由緩存生成的響應(yīng)中,另外規(guī)定它必須轉(zhuǎn)發(fā)。 -
逐跳首部(Hop-by-hop Header)
分在此類別的首部支隊(duì)單詞轉(zhuǎn)發(fā)有效,會(huì)因通過緩存活代理而不再轉(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:操作緩存的工作機(jī)制
- 表示是否緩存的指令
-
public
:明確表明其他用戶也可利用緩存。 -
private
:緩存服務(wù)器會(huì)對該特定用戶提供資源緩存的服務(wù),而其他用戶發(fā)送過來的請求不會(huì)返回緩存,與public相反。 -
no-cache
:為了防止從緩存中返回過期的資源。 -
no-store
:規(guī)定緩存不能在本地存儲請求或響應(yīng)的任一部分。
說明:從字面上很容易把no-cache誤解為不緩存,但其實(shí)no-cache代表不緩存過期的資源,緩存會(huì)向源服務(wù)器進(jìn)行有效期確認(rèn)后處理資源。no-store才是真正地不進(jìn)行緩存。
-
- 指定緩存期限和認(rèn)證的指令
-
Cache-Control: max-age=604800
,如果判定緩存資源的緩存時(shí)間數(shù)值比max-age值小,客戶端就接收緩存的資源。當(dāng)max-age為0時(shí),緩存服務(wù)器通常需要將請求轉(zhuǎn)發(fā)給源服務(wù)器。 -
Cache-Control: s-maxage=604800
,與max-age相同,不同點(diǎn)時(shí)s-maxage只適用于多位用戶使用的公共緩存服務(wù)器(代理)。當(dāng)使用s-maxage指令后,會(huì)忽略Expires首部字段以及max-age指令處理。 -
Cache-Control: min-fresh=60
,要求緩存服務(wù)器返回至少還沒過指定時(shí)間的緩存資源。 -
Cache-Control: max-stale=3600
,指緩存資源,即使過期也照常接收。 -
Cache-Control: only-if-cached
,要求緩存服務(wù)器不重新加載響應(yīng),也不會(huì)再次確認(rèn)資源有效性。如果請求緩存服務(wù)器的本地緩存無響應(yīng),則返回504。 -
Cache-Control: must-revalidate
,代理會(huì)向資源服務(wù)器再次驗(yàn)證即將返回的響應(yīng)緩存是否有效。使用該指令會(huì)忽略max-stale。 -
Cache-Control: proxy-revalidate
,緩存服務(wù)器收到請求,必須再次驗(yàn)證緩存有效性。 -
Cache-Control: no-transform
,緩存不能改變實(shí)體主體的媒體類型。可防止緩存或代理壓縮圖片等類似操作。
-
Connection
-
控制不再轉(zhuǎn)發(fā)給代理的首部字段
Connection: 不在轉(zhuǎn)發(fā)的首部字段名
-
管理持久連接
Connection: close
,當(dāng)服務(wù)端明確斷開連接是,則指定Connection首部字段的值為Close。
Connection: Keep-Alive
,HTTP/1.1默認(rèn)連接為持久連接。
Data:表示創(chuàng)建HTTP報(bào)文的日期和時(shí)間,時(shí)間格式:Date: Tue, 03 Jul 2012 04:40:59 GMT
Pragma:HTTP/1.1之前版本的歷史遺留字段,Pragma: no-cache
。類似Cache-Control: no-cache
Trailer:說明:Trailer會(huì)事先說明報(bào)文主體后記錄了哪些首部字段。該首部字段可應(yīng)用在HTTP/1.1版本分塊傳輸編碼時(shí)。
Transfer-Encoding
- 規(guī)定了傳輸報(bào)文主體時(shí)采用的編碼方式。
- HTTP/1.1的傳輸編碼方式僅對分塊傳輸編碼有效。
Upgrade
- 用于檢測HTTP協(xié)議及其他協(xié)議是否可使用更高的版本進(jìn)行通訊,其參數(shù)值可以用來制定一個(gè)完全不同的通信協(xié)議。
- 使用首部字段Upgrade時(shí),還需額外制定
Connection: Upgrade
Via
- 報(bào)文經(jīng)過代理或網(wǎng)關(guān)時(shí),會(huì)先在首部字段Via中附加該服務(wù)器的信息,然后再轉(zhuǎn)發(fā)。
- Via不僅用于追蹤報(bào)文的轉(zhuǎn)發(fā),還可避免請求回環(huán)的發(fā)生。
Warning
- 從HTTP/1.0的響應(yīng)首部(Retry-After)演變過來,告知用戶一些與緩存相關(guān)的問題和警告。
- 格式:
Warning: [警告碼] [警告的主機(jī):端口號]
"[警告內(nèi)容]" ([日期時(shí)間])
110 Response is stale 代理返回已過期的資源
111 Revalidation failed 代理再驗(yàn)證資源有效性時(shí)失?。ǚ?wù)器無法到達(dá)等原因)
112 Disconnection operation 代理與互聯(lián)網(wǎng)連接被故意切斷
113 Heuristic expiration 響應(yīng)的使用期超過24小時(shí)
199 Miscellaneous warning 任意的警告內(nèi)容
214 Transformation applied 代理對內(nèi)容編碼或媒體類型等執(zhí)行了某些處理時(shí)
299 Miscellaneous persistent warning 任意的警告內(nèi)容
6. 請求首部字段
**Accept**
- 告訴服務(wù)器,用戶代理能夠處理的媒體類型及媒體類型的相對優(yōu)先級。
- 可使用`type/subtype`這種形式,一次指定多種媒體類型。q代表權(quán)重,范圍是0~1
`Accept: text/html,application/Xhtml+xml,application/xml;q=0.9,*/*;q=0.8`
**Accept-Charset**:用來通知服務(wù)器用戶代理支持的**字符集及字符集的相對優(yōu)先級**
**Accept-Encoding**
- 用來告知服務(wù)器用戶代理支持的**內(nèi)容編碼及內(nèi)容編碼的優(yōu)先級順序**
- `Accept-Encoding: gzip, deflate`
**Accept-Language**:告知服務(wù)器用戶代理能夠處理的**自然語言集,以及相對優(yōu)先級**
**Authorization**:用來告知服務(wù)器,用戶代理的認(rèn)證信息。
**Except**:告知服務(wù)器,期望出現(xiàn)的某種特定行為。
**From**:告知服務(wù)器使用用戶代理的用戶的電子郵件地址。
**Host**:告知服務(wù)器請求的資源所處的互聯(lián)網(wǎng)主機(jī)名和端口號。
**If-Match**
- 只有當(dāng)If-Match的字段值根ETag值匹配一致時(shí),服務(wù)器才會(huì)接受請求。反之,返回412狀態(tài)嗎
- 如果使(\*)指定If-Match的字段值,服務(wù)器將會(huì)忽略ETag,只要資源存在就處理請求。
**If-Modified-Since**:如果在If-Modified-Since字段指定的日期時(shí)間后,資源發(fā)生了更新,服務(wù)器會(huì)接受請求。
**If-None-Match**:只有在If-None-Match的字段值與ETag值不一致時(shí),可處理請求。與If-Match首部字段的作用相反。
**If-Range**:告知服務(wù)器若指定的If-Range字段值和請求資源的ETag值或時(shí)間一致時(shí),則作為范圍請求處理。反之,則返回全體資源。
**If-Unmodified-Since**:與If-Modified-Since相反。
**Max-Forwards**:轉(zhuǎn)發(fā)數(shù),每次轉(zhuǎn)發(fā)值減1.當(dāng)值變0時(shí),返回響應(yīng)。
**Proxy-Authorization**
- 接收到從代理服務(wù)器發(fā)來的認(rèn)證質(zhì)詢時(shí),客戶端會(huì)發(fā)送包含首部字段Proxy-Authorization的請求,以告知服務(wù)器認(rèn)證需要的信息。
- 注意:認(rèn)證行為發(fā)生在客戶端與代理之間。
**Range**:返回資源的指定范圍
**Referer**:告知服務(wù)器請求的原始資源的URL
**TE**:告知服務(wù)器客戶端能夠處理響應(yīng)的傳輸編碼方式及相對優(yōu)先級,與Accept-Encoding功能相似,但是用于傳輸編碼。
**User-Agent**,告知服務(wù)器創(chuàng)建請求的瀏覽器和用戶代理名稱等信息。
7. 響應(yīng)首部字段
**Accept-Ranges**
- 告知客戶端服務(wù)器是否能處理范圍請求
- 可指定的字段值有:可處理范圍請求時(shí)指定其為bytes,反之則指定其為none。
**Age**:告知客戶端,源服務(wù)器在多久前創(chuàng)建了響應(yīng)。字段值的單位為秒。
**ETag**:
- 一種可將資源以字符串形式做唯一標(biāo)識的方式。
- 資源更新時(shí),ETag需要更新。
- 強(qiáng)ETag值,不論實(shí)體發(fā)生多么細(xì)微的變化都會(huì)改變其值。`ETag: "usagi-1234"`
- 弱ETag值,只有資源發(fā)生了根本改變,才會(huì)改變ETag值。在字段值最開始附加W `ETag: W/"usagi-1234"`
**Location**:重定向。
**Proxy-Authenticate**:會(huì)把由代理服務(wù)器所要求的認(rèn)證信息發(fā)送給客戶端。
**Retry-After**:告訴客戶端應(yīng)該多久之后再次發(fā)送請求。
**Server**:告訴客戶端服務(wù)器上安裝的HTTP服務(wù)器應(yīng)用程序的信息。
**Vary**:首部字段Vary可對緩存進(jìn)行控制。當(dāng)Vary字段值為Accept-Language,那么只有對持相同自然語言的請求返回緩存。
**WWW-Authenticate**:用于HTTP訪問認(rèn)證。
8. 實(shí)體首部字段
**Allow**:通知客戶端能夠支持Request-URI指定資源的HTTP方法。
**Content-Encoding**:
- 告知客戶端服務(wù)器對實(shí)體的主體部分選用的內(nèi)容編碼方式。內(nèi)容編碼是值在不丟失實(shí)體信息的前提下所進(jìn)行的壓縮。
- 主要采用以下4種內(nèi)容編碼的方式。(gzip、compress、deflate、identity)
**Content-Language**:告知客戶端,實(shí)體主體使用的自然語言。
**Content-Length**:表明實(shí)體主體部分的大小,單位是字節(jié)。
**Content-Location**:表示報(bào)文主體返回資源對應(yīng)的URI。
**Content-MD5**:該字段的值是一串MD5算法生成的值,目的在于檢查報(bào)文主體在傳輸過程中是否保持完整。
**Content-Range**:針對范圍的請求,返回響應(yīng)時(shí)使用的首部字段Content-Range,能告知客戶端作為響應(yīng)返回的實(shí)體的哪個(gè)部分符合范圍請求。
**Content-Type**:說明了實(shí)體主體內(nèi)對象的媒體類型。
**Expires**:告知客戶端資源實(shí)效日期,實(shí)效前,響應(yīng)的副本會(huì)一直被保存。
**Last-Modified**:資源最終修改的時(shí)間。
9. 為Cookie服務(wù)的首部字段
**Set-Cookie**:開始狀態(tài)管理所使用的Cookie信息,響應(yīng)首部字段
NAME=VALUE 賦予Cookie的名稱和其值(必需項(xiàng))。
expires=DATE Cookie的有效期,默認(rèn)為瀏覽器關(guān)閉前為止。
path=PATH 將服務(wù)器上的文件目錄作為Cookie的適用對象。
domain=域名 作為Cookie適用對象的域名,可設(shè)置domain用于跨域操作。
Secure 僅在HTTPS安全通信時(shí)才會(huì)發(fā)送Cookie。
HttpOnly 加以限制,使Cookie不能被JavaScript腳本訪問。
**Cookie**:服務(wù)器接收到的Cookie信息,請求首部字段
Cookie: status=enable
首部字段Cookie會(huì)告知服務(wù)器,當(dāng)客戶端想要獲得HTTP狀態(tài)管理支持時(shí),就會(huì)在請求中包含從服務(wù)器接收到的Cookie。
10. 其他首部字段
**X-Frame-Options**:用于控制網(wǎng)站內(nèi)在其他Web網(wǎng)站的Frame標(biāo)簽內(nèi)的顯示問題,目的是為了防止點(diǎn)擊劫持攻擊。有兩個(gè)值:**DENY**,拒絕;**SAMEORIGIN**,僅同源域名下的頁面匹配時(shí)許可。
**X-XSS-Protection**:針對跨站腳本攻擊的一種對策。0:將XSS過濾設(shè)置成無效狀態(tài),1:相反。
**DNT**:Do Not Track,意為拒絕個(gè)人信息被收集,是表示拒絕被精準(zhǔn)廣告追蹤的一種方法。0:同意被追蹤,1:拒絕被追蹤。
**P3P**:通過利用P3P(The Platform for Privacy Preferences,在線隱私偏好平臺)技術(shù),可以讓W(xué)eb網(wǎng)站上的個(gè)人隱私變成一種僅供程序可理解的形式,以達(dá)到保護(hù)用戶隱私的目的。