HTTP內(nèi)容協(xié)商

一個URL常常需要代表若干不同的資源。例如那種需要以多種語言提供其內(nèi)容的網(wǎng)站站點。如果某個站點有說法語的和說英語的兩種用戶,它可能想用這兩種語言提供網(wǎng)站站點信息。理想情況下,服務器應當向英語用戶發(fā)送英文版,向法語用戶發(fā)送法文版——用戶只要訪問網(wǎng)站主頁就可以得到相應語言的內(nèi)容

專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)豐城免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了近千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

HTTP提供了內(nèi)容協(xié)商方法,允許客戶端和服務器作這樣的決定。通過這些方法,單一的URL就可以代表不同的資源(比如,同一個網(wǎng)站頁面的法語版和英語版),這些不同的版本稱為變體。本文將詳細介紹內(nèi)容協(xié)商

總括

對于特定的URL來說,服務器可以根據(jù)一些原則來決定發(fā)送什么內(nèi)容給客戶端最合適。在有些場合下,服務器甚至可以自動生成定制的頁面。比如,服務器可以為手持設備把HTML頁面轉(zhuǎn)換成WML頁面。這類動態(tài)內(nèi)容變換被稱為轉(zhuǎn)碼。這些變換動作是HTTP客戶端和服務器之間進行內(nèi)容協(xié)商的結(jié)果

共有3種不同的方法可以決定服務器上哪個頁面最適合客戶端:讓客戶端來選擇、服務器自動判定,或讓中間代理來選。這3種技術(shù)分別稱為客戶端驅(qū)動的協(xié)商、服務器驅(qū)動的協(xié)商以及透明協(xié)商

客戶端驅(qū)動

對于服務器來說,收到客戶端請求時只是發(fā)回響應,在其中列出可用的頁面,讓客戶端決定要看哪個,這是最容易的事情。很顯然,這是服務器最容易實現(xiàn)的方式,而且客戶端很可能選擇到最佳的版本(只要列表中有讓客戶端選擇的足夠信息)。不利之處是每個頁面都需要兩次請求:第一次獲取列表,第二次獲取選擇的副本。這種技術(shù)速度很慢且過程枯燥乏味,讓用戶厭煩

從實現(xiàn)原理上來說,服務器實際上有兩種方法為客戶端提供選項:一是發(fā)送回一個HTML文檔,里面有到該頁面的各種版本的鏈接和每個版本的描述信息,另一種方法是發(fā)送回HTTP/1.1響應時,使用300 Multiple Choices響應代碼??蛻舳藶g覽器收到這種響應時,在前一種情況下,會顯示一個帶有鏈接的頁面,在后一種情況下,可能會彈出對話窗口,讓用戶做選擇。不管怎么樣,決定是由客戶端的瀏覽器用戶作出的

除了增加時延并且對每個頁面都要進行繁瑣的多次請求之外,這種方法還有一個缺點:它需要多個URL:公共頁面要一個,其他每種特殊頁面也都要一個。因此,比如說原始的請求地址是www.joes-hardware.com,Joe的服務器可能會回復某個頁面,該頁面里面有到www.joes-hardware.com/english和www.joes-hardware.com/french的鏈接。如果客戶端想加書簽的話,是要加在原始的公共頁面上呢,還是加在選中的頁面上呢?如果用戶想把這個網(wǎng)站推薦給他的朋友,是告知www.joes-hardware.com這個地址好呢,還是只告訴他們講英語的朋友www.joes-hardware.com/english這個地址?

服務器驅(qū)動

減少額外通信量的一種方法是讓服務器來決定發(fā)送哪個頁面回去,但為了做到這一點,客戶端必須發(fā)送有關(guān)客戶偏好的足夠信息,以便服務器能夠作出準確的決策。服務器通過客戶端請求的首部集來獲得這方面的信息

有以下兩種機制可供HTTP服務器評估發(fā)送什么響應給客戶端比較合適

1、檢査內(nèi)容協(xié)商首部集。服務器察看客戶端發(fā)送的Accept首部集,設法用相應的響應首部與之匹配

2、根據(jù)其他(非內(nèi)容協(xié)商)首部進行變通。例如,服務器可以根據(jù)客戶端發(fā)送的User-Agent首部來發(fā)送響應

【內(nèi)容協(xié)商首部集】

客戶端可以用下面列出的HTTP首部集發(fā)送用戶的偏好信息

首部           描述
Accept           告知服務器發(fā)送何種媒體類型
Accept-Language      告知服務器發(fā)送何種語言
Accept-Charset      告知服務器發(fā)送何種字符集
Accept-Encoding      告知服務器采用何種編碼

[注意]這些首部與實體首部非常類似。不過,這兩種首部的用途截然不同。實體首部集像運輸標簽,它們描述了把報文從服務器傳輸給客戶端的過程中必須的各種報文主體屬性。而內(nèi)容協(xié)商首部集是由客戶端發(fā)送給服務器用于交換偏好信息的,以便服務器可以從文檔的不同版本中選擇出最符合客戶端偏好的那個來提供服務

服務器用下面列出的實體首部集來匹配客戶端的Accept首部集

Accept首部          實體首部
Accept          Content-Type
Accept-Language     Content-Language
Accept-Charset      Content-Type
Accept-Encoding     Content-Encoding

由于HTTP是無狀態(tài)的協(xié)議,表示服務器不會在不同的請求之間追蹤客戶端的偏好,所以客戶端必須在每個請求中都發(fā)送其偏好信息

如果兩個客戶端都發(fā)送了Accept-Language首部,描述它們感興趣的語言信息,服務器就能夠決定發(fā)送www.joes-hardware.com的何種版本給哪個客戶端了。讓服務器自動選擇發(fā)送回去的文檔,減少了往返通信的時延,這種時延是客戶端驅(qū)動模型中無法避免的

然而,假設某個客戶端偏好西班牙文,那服務器應當回送哪個版本的頁面呢?英語還是法語?服務器只有兩種選擇:猜測或回退到客戶端驅(qū)動模型,問客戶端選擇哪個。假如這個西班牙人碰巧懂一點英語,他可能會選擇英文頁面,這不是最理想的,但它能解決問題。在這種情況下,這個西班牙人需要有辦法傳達更多與其偏好有關(guān)的信息,也就是他的確對英語略知一二,在沒有西班牙語的時候,英語也行

幸運的是,HTTP提供了一種機制,可以讓與這個西班牙人情況類似的客戶端更詳細地描述其偏好。這種機制就是質(zhì)量值(簡稱q值)

HTTP協(xié)議中定義了質(zhì)量值,允許客戶端為每種偏好類別列出多種選項,并為每種偏好選項關(guān)聯(lián)一個優(yōu)先次序。例如,客戶端可以發(fā)送下列形式的Accept-Language首部:

Accept-Language: en; q=0.5, fr; q=0.0 , nl; q=1.0, tr; q=0.0

其中q值的范圍從0.0-1.0(0.0是優(yōu)先級最低的,而1.0是優(yōu)先級最高的)。上面列出的那個首部,說明該客戶端最愿意接收荷蘭語(縮寫為nl)文檔,但英語(縮寫為en)文檔也行;無論如何,這個客戶端都不愿意收到法語(縮寫為fr)或土耳 其語(縮寫為tr)的版本

[注意]偏好的排列順序并不重要,只有與偏好相關(guān)的q值才是重要的

服務器偶爾也會碰到找不到文檔可以匹配客戶端的任何偏好的情況。對于這種情況,服務器可以修改文檔,也就是對文檔進行轉(zhuǎn)碼,以匹配客戶端的偏好

【其他首部集】

服務器也可以根據(jù)其他客戶端請求首部集來匹配響應,比如User-Agent首部。例如,服務器知道老版本的瀏覽器不支持JavaScript語言,這樣就可以向其發(fā)送不含有JavaScript的頁面版本

在這種情況下,沒有q值機制可供査找“最近似”的匹配。服務器或者去找完全匹配,或者簡單地有什么就給什么,這取決于服務器的實現(xiàn)

由于緩存需要盡力提供所緩存文檔中正確的“最佳”版本,HTTP協(xié)議定義了服務器在響應中發(fā)送的Vary首部。這個首部告知緩存,還有客戶端和所有下游的代理,服務器根據(jù)哪些首部來決定發(fā)送響應的最佳版本

【Apache】

下面概括了著名的Web服務器Apache是如何支持內(nèi)容協(xié)商的。網(wǎng)站的內(nèi)容提供者,比如說Joe要負責為Joe的索引頁面提供不同的版本。Joe還必須把這些索引頁面文件放在和站點相關(guān)的Apache服務器的適當目錄下。用以下兩種方式可以啟用內(nèi)容協(xié)商

1、在網(wǎng)站目錄中,為網(wǎng)站中每個有變體的URI創(chuàng)建一個type-map(類型映射)文件。這個type-map文件列出了每個變體和其相關(guān)的內(nèi)容協(xié)商首部集

2、啟用MultiViews指令,這樣會使Apache自動為目錄創(chuàng)建type-map文件

【使用type-map文件】

Apache服務器需要知道type-map文件的命名規(guī)則??梢栽诜掌鞯呐渲梦募性O置handler來說明type-map文件的后綴名。例如:

AddHandler type-map .var

這行就說明了后綴是.var的文件就是type-map文件

下面給出一個type-map文件示例

根據(jù)這個type-map文件,Apache服務器就知道要發(fā)送joes-hardware.en.html給請求英語版的客戶端,發(fā)送joes-hardware.fr.de.html給請求法語版的客戶端。Apache服務器也支持質(zhì)量值

【使用MultiView】

為了使用MultiView,必須在網(wǎng)站目錄下的access.conf文件中的適當小節(jié)(<Directory>、<Location>,或<Files>)使用OPTION指令來啟用它

如果啟用了MultiView,而瀏覽器又請求了名為joes-hardware的資源,服務器就會査找所有名字中含有joes-hardware的文件,并為它們創(chuàng)建type-map文件。服務器會根據(jù)名字猜測其對應的內(nèi)容協(xié)商首部集。例如,法語版的joes-hardware應當含有.fr

另一種在服務器端實現(xiàn)內(nèi)容協(xié)商的方法是使用服務器端擴展,比如微軟的動態(tài)服務器頁面(Microsoft’s Active Server Pages, ASP)

透明協(xié)商

透明協(xié)商機制試圖從服務器上去除服務器驅(qū)動協(xié)商所需的負載,并用中間代理來代表客戶端以使與客戶端的報文交換最小化。假定代理了解客戶端的預期,這樣就可以代表客戶端與服務器協(xié)商,在客戶端請求內(nèi)容的時候,代理已經(jīng)收到了客戶端的預期

為了支持透明內(nèi)容協(xié)商,服務器必須有能力告知代理,服務器需要檢査哪些請求首部,以便對客戶端的請求進行最佳匹配。HTTP/1.1規(guī)范中沒有定義任何透明協(xié)商機制,但定義了Vary首部。服務器在響應中發(fā)送了Vary首部,以告知中間節(jié)點需要使用哪些請求首部進行內(nèi)容協(xié)商

代理緩存可以為通過單個URL訪問的文檔保存不同的副本。如果服務器把它們的決策過程傳給緩存,這些代理就能代表服務器與客戶端進行協(xié)商。緩存同時也是進行內(nèi)容轉(zhuǎn)碼的好地方,因為部署在緩存里的通用轉(zhuǎn)碼器能對任意服務器,而不僅僅是一臺服務器傳來的內(nèi)容進行轉(zhuǎn)碼

【緩存與備用候選】

對內(nèi)容進行緩存的時候是假設內(nèi)容以后還可以重用。然而,為了確保對客戶端請求回送的是正確的已緩存響應,緩存必須應用服務器在回送響應時所用到的大部分決策邏輯

上面描述了客戶端發(fā)送的Accept首部集,以及為了給每條請求選擇最佳的響應,服務器使用的與這些首部集匹配的相應實體首部集。緩存也必須使用相同的首部集來決定回送哪個已緩存的響應

下圖展示了涉及緩存的正確及錯誤的操作序列。緩存把第一個請求轉(zhuǎn)發(fā)給服務器,并存儲其響應。對于第二個請求,緩存根據(jù)URL査找到了匹配的文檔。但是,這份文檔是法語版的,而請求者想要的是西班牙語版的。如果緩存只是把文檔的法語版本發(fā)給請求者的話,它就犯了錯誤

因此,緩存也應該把第二條請求轉(zhuǎn)發(fā)給服務器,并保存該URL的響應與“備用候選”響應。緩存現(xiàn)在就保存了同一個URL的兩份不同的文檔,與服務器上一樣。這些不同的版本稱為變體(variant)或備用候選(alternate)。內(nèi)容協(xié)商可看成是為客戶端請求選擇最合適變體的過程

【Vary 首部】

這里是瀏覽器和服務器發(fā)送的一些典型的請求及響應首部

然而,如果服務器的決策不是依據(jù)Accept首部集,而是比如User-Agent首部的話,情況會如何?這不像聽起來這么極端。例如,服務器可能知道老版本的瀏覽器不支持JavaScript語言,因此可能會回送不包含JavaScript的頁面版本。如果服務器是根據(jù)其他首部來決定發(fā)送哪個頁面的話,緩存必須知道這些首部是什么,這樣才能在選擇回送的頁面時做出同樣的邏輯判斷

HTTP的Vary響應首部中列出了所有客戶端請求首部,服務器可用這些首部來選擇文檔或產(chǎn)生定制的內(nèi)容(在常規(guī)的內(nèi)容協(xié)商首部集之外的內(nèi)容)。例如,若所提供的文檔取決于User-Agent首部,Vary首部就必須包含User-Agent

當新的請求到達時,緩存會根據(jù)內(nèi)容協(xié)商首部集來尋找最佳匹配。但在把文檔提供給客戶端之前,它必須檢査服務器有沒有在已緩存響應中發(fā)送Vary首部。如果有Vary首部,那么新請求中那些首部的值必須與舊的已緩存請求里相應的首部相同。因為服務器可能會根據(jù)客戶端請求的首部來改變響應,為了實現(xiàn)透明協(xié)商,緩存必須為每個已緩存變體保存客戶端請求首部和相應的服務器響應首部

如果某服務器的Vary首部看起來像下面這樣,大量不同的User-Agent和Cookie值將會產(chǎn)生非常多的變體:

Vary: User-Agent, Cookie

緩存必須為每個變體保存其相應的文檔版本。當緩存執(zhí)行査找時,首先會對內(nèi)容協(xié)商首部集進行內(nèi)容匹配,然后比較請求的變體與緩存的變體。如果無法匹配,緩存就從原始服務器獲取文檔

轉(zhuǎn)碼

我們已經(jīng)討論了一個機制,該機制可以讓客戶端和服務器從某個URL的一系列文檔中挑選出最適合客戶端的文檔。實現(xiàn)這些機制的前提是,存在一些滿足客戶端需求的文檔——不管是完全滿足還是在一定程度上滿足

然而,如果服務器沒有能滿足客戶端需求的文檔會怎么樣呢?服務器可以給出一個錯誤響應。但理論上,服務器可以把現(xiàn)存的文檔轉(zhuǎn)換成某種客戶端可用的文檔。這種選項稱為轉(zhuǎn)碼

下面列出了一些假設的轉(zhuǎn)碼

轉(zhuǎn)換之前             轉(zhuǎn)換之后
HTML文檔              WML文檔
高分辨率圖像            低分辨率圖像
彩×××像              黑白圖像
有多個框架的復雜頁面        沒有很多框架或圖像的簡單文本頁面
有Java小應用程序的HTML頁面    沒有Java小應用程序的HTML頁面
有廣告的頁面            去除廣告的頁面

有3種類別的轉(zhuǎn)碼:格式轉(zhuǎn)換、信息綜合以及內(nèi)容注入

【格式轉(zhuǎn)換】

格式轉(zhuǎn)換是指將數(shù)據(jù)從一種格式轉(zhuǎn)換成另一種格式,使之可以被客戶端査看。通過HTML到WML的轉(zhuǎn)換,無線設備就可以訪問通常供桌面客戶端査看的文檔了。通過慢速連接訪問Web頁面的客戶端并不需要接收高分辨率圖像,如果通過格式轉(zhuǎn)換降低圖像分辨率和顏色來減小圖像文件大小的話,這類客戶端就能更容易地査看圖像比較豐富的頁面了

格式轉(zhuǎn)換可以由內(nèi)容協(xié)商首部集來驅(qū)動,但也能由User-Agent首部來驅(qū)動。注意,內(nèi)容轉(zhuǎn)換或轉(zhuǎn)碼與內(nèi)容編碼或傳輸編碼是不同的,后兩者一般用于更高效或安全地傳輸內(nèi)容,而前兩者則可使訪問設備能夠査看內(nèi)容

【信息綜合】

從文檔中提取關(guān)鍵的信息片段稱為信息綜合(information synthesis),這是一種有用的轉(zhuǎn)碼操作。這種操作的例子包括根據(jù)小節(jié)標題生成文檔的大綱,或者從頁面中刪除廣告和商標

根據(jù)內(nèi)容中的關(guān)鍵字對頁面分類是更精細的技術(shù),有助于總結(jié)文檔的精髓。這種技術(shù)常用于Web頁面分類系統(tǒng)中,比如門戶網(wǎng)站的Web頁面目錄

【內(nèi)容注入】

前面描述的兩類轉(zhuǎn)碼通常會減少Web文檔的內(nèi)容,但還有另一類轉(zhuǎn)換會增加文檔的內(nèi)容,即內(nèi)容注入轉(zhuǎn)碼。內(nèi)容注入轉(zhuǎn)碼的例子有自動廣告生成器和用戶追蹤系統(tǒng)

設想一下,一個能往途經(jīng)的每個HTML頁面中自動添加廣告的廣告植入轉(zhuǎn)碼器是多么的誘人,當然也很煩人。這類轉(zhuǎn)碼操作只能動態(tài)進行——它必須即時添加與當前的特定用戶有關(guān),或針對特定用戶的廣告。也可以構(gòu)建用戶追蹤系統(tǒng),在頁面中動態(tài)增加內(nèi)容,用于收集用戶査看頁面和客戶端瀏覽方式的統(tǒng)計信息

【轉(zhuǎn)碼與靜態(tài)預生成的對比】

轉(zhuǎn)碼的替代做法是在Web服務器上建立Web頁面的不同副本,例如一個是HTML,一個是WML;一個圖像分辨率高,一個圖像分辨率低;一個有多媒體內(nèi)容,一個沒有。但是,這種方法不是很切合實際,原因很多:某個頁面中的任何小改動都會牽扯很多頁面,需要很多空間來存儲各頁面的不同版本,而且使頁面編目和Web服務器編程(以提供正確的版本)變得更加困難。有些轉(zhuǎn)碼操作,比如廣告插入(尤其是定向廣告插入),就不能靜態(tài)實現(xiàn)——因為插入什么廣告和請求頁面的用戶有關(guān)

對單一的根頁面進行即時轉(zhuǎn)換,是比靜態(tài)的預生成更容易的解決方案。但這樣會在提供內(nèi)容時增加時延。不過有時候其中一些計算可以由第三方進行,這樣就減少了Web服務器上的計算負荷——比如可以由代理或緩存中的外部Agent完成轉(zhuǎn)換


本文名稱:HTTP內(nèi)容協(xié)商
網(wǎng)站網(wǎng)址:http://bm7419.com/article18/iihodp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供Google、、面包屑導航、軟件開發(fā)、App設計、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)