精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

漫談:HTTP網絡協議中Vary響應頭

網絡 網絡管理
經常抓包看 HTTP 請求的同學應該對 Vary 這個響應頭字段并不陌生,它有什么用?

經常抓包看 HTTP 請求的同學應該對 Vary 這個響應頭字段并不陌生,它有什么用?用 PageSpeed 工具檢查頁面時,經常看到「Specify a Vary: Accept-Encoding header(請指定一個 Vary: Accept-Encoding 標頭)」這樣的建議,為什么要這樣做?本文記錄我對 Vary 的一些研究,其中就包含這些問題的答案。

HTTP 內容協商

要了解 Vary 的作用,先得了解 HTTP 的內容協商機制。有時候,同一個 URL 可以提供多份不同的文檔,這就要求服務端和客戶端之間有一個選擇最合適版本的機制,這就是內容協商。

協商方式有兩種,一種是服務端把文檔可用版本列表發給客戶端讓用戶選,這可以使用 300 Multiple Choices 狀態碼來實現。這種方案有不少問題,首先多一次網絡往返;其次服務端同一文檔的某些版本可能是為擁有某些技術特征的客戶端準備的,而普通用戶不一定了解這些細節。舉個例子,服務端通常可以將靜態資源輸出為壓縮和未壓縮兩個版本,壓縮版顯然是為支持壓縮的客戶端而準備的,但如果讓普通用戶選,很可能選擇錯誤的版本。

所以 HTTP 的內容協商通常使用另外一種方案:服務端根據客戶端發送的請求頭中某些字段自動發送最合適的版本。可以用于這個機制的請求頭字段又分兩種:內容協商專用字段(Accept 字段)、其他字段。

首先來看 Accept 字段,詳見下表:

請求頭字段 說明 響應頭字段
Accept 告知服務器發送何種媒體類型 Content-Type
Accept-Language 告知服務器發送何種語言 Content-Language
Accept-Charset 告知服務器發送何種字符集 Content-Type
Accept-Encoding 告知服務器采用何種壓縮方式 Content-Encoding

例如客戶端發送以下請求頭:

Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,en-US;q=0.8,en;q=0.6

表示它可以接受任何 MIME 類型的資源;支持采用 gzip、deflate 或 sdch 壓縮過的資源;可以接受 zh-CN、en-US 和 en 三種語言,并且 zh-CN 的權重***(q 取值 0 - 1,***為 1,***為 0,默認為 1),服務端應該優先返回語言等于 zh-CN 的版本。

瀏覽器的響應頭可能是這樣的:

Content-Type: text/javascript
Content-Encoding: gzip

表示這個文檔確切的 MIME 類型是 text/javascript;文檔內容進行了 gzip 壓縮;響應頭沒有 Content-Language 字段,通常說明返回版本的語言正好是請求頭 Accept-Language 中權重***的那個。

有時候,上面四個 Accept 字段并不夠用,例如要針對特定瀏覽器如 IE6 輸出不一樣的內容,就需要用到請求頭中的 User-Agent 字段。類似的,請求頭中的 Cookie 也可能被服務端用做輸出差異化內容的依據。

由于客戶端和服務端之間可能存在一個或多個中間實體(如緩存服務器),而緩存服務最基本的要求是給用戶返回正確的文檔。如果服務端根據不同 User-Agent 返回不同內容,而緩存服務器把 IE6 用戶的響應緩存下來,并返回給使用其他瀏覽器的用戶,肯定會出問題 。

所以 HTTP 協議規定,如果服務端提供的內容取決于 User-Agent 這樣「常規 Accept 協商字段之外」的請求頭字段,那么響應頭中必須包含 Vary 字段,且 Vary 的內容必須包含 User-Agent。同理,如果服務端同時使用請求頭中 User-Agent 和 Cookie 這兩個字段來生成內容,那么響應中的 Vary 字段看上去應該是這樣的:

Vary: User-Agent, Cookie

也就是說 Vary 字段用于列出一個響應字段列表,告訴緩存服務器遇到同一個 URL 對應著不同版本文檔的情況時,如何緩存和篩選合適的版本。

有 BUG 的緩存服務

再來看 PageSpeed 的「Specify a Vary: Accept-Encoding header」這個提示,按照上面的說明,Accept-Encoding 屬于內容協商專用字段,服務端只需要在響應頭中增加 Content-Encoding 字段,用來指明內容壓縮格式;或者不輸出 Content-Encoding 表明內容未經過壓縮就可以了。而緩存服務器,應該針對不同的 Content-Encoding 緩存不同內容,再根據具體請求中的 Accept-Encoding 字段返回最合適的版本。

但是有些實現得有 BUG 的緩存服務器,會忽略響應頭中的 Content-Encoding,從而可能給不支持壓縮的客戶端返回緩存的壓縮版本。有兩個方案可以避免這種情況發生:

將響應頭中的 Cache-Control 字段設為 private,告訴中間實體不要緩存它;

增加 Vary: Accept-Encoding 響應頭,明確告知緩存服務器按照 Accept-Encoding 字段的內容,分別緩存不同的版本;

通常為了更好的利用中間實體的緩存功能,我們都用第二種方案。

對于 css、js 這樣的靜態資源,只要客戶端支持 gzip,服務端應該總是啟用它;同時為了避免有 BUG 的緩存服務器給用戶返回錯誤的版本,還應該輸出 Vary: Accept-Encoding。

Nginx 和 SPDY

通常,上面說的這些工作,Web Server 都可以幫我們搞定。對于 Nginx 來說,下面這個配置可以自動給啟用了 gzip 的響應加上 Vary: Accept-Encoding:

gzip_vary on;

#p#

用 curl 驗證我博客的 js 文件,響應頭如下:

jerry@www:~$ curl --head https://imququ.com/.../xx.js
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 31 Dec 2013 16:34:48 GMT
Content-Type: application/x-javascript
Content-Length: 66748
Last-Modified: Tue, 31 Dec 2013 14:30:52 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "52c2d51c-104bc"
Expires: Fri, 29 Dec 2023 16:34:48 GMT
Cache-Control: max-age=315360000
Strict-Transport-Security: max-age=31536000
Accept-Ranges: bytes

可以看到,服務端正確輸出了「Vary: Accept-Encoding」,一切正常。

但是用 Chrome 自帶抓包工具看下,這個響應頭卻是這樣:

HTTP/1.1 200 OK
cache-control: max-age=315360000
content-encoding: gzip
content-type: application/x-javascript
date: Tue, 31 Dec 2013 16:35:27 GMT
expires: Fri, 29 Dec 2023 16:35:27 GMT
last-modified: Tue, 31 Dec 2013 14:30:52 GMT
server: nginx
status: 200
strict-transport-security: max-age=31536000
version: HTTP/1.1

我的博客支持 SPDY/2 協議,用 Chrome 訪問我博客會走 SPDY,所以上面的響應頭看上有點不同尋常,例如字段名都變成了小寫;多了 status、version 等字段,這些變化下次專門介紹(注:見。神奇的是盡管服務端沒任何變化,但響應中的 Vary: Accept-Encoding 卻不見了。

SPDY 規定客戶端必須支持壓縮,這意味著 SPDY 服務器可以直接啟用壓縮而不用關心請求頭中的 Accept-Encoding 字段。下面這段來自 Nginx 支持的 SPDY/2 協議:

User-agents are expected to support gzip and deflate compression. Regardless of the Accept-Encoding sent by the user-agent, the server may select gzip or deflate encoding at any time. [via]

于是,對于支持 SPDY 的客戶端來說,Vary: Accept-Encoding 沒有用途,Nginx 選擇直接去掉它,可以節省一點流量。curl 或其他不支持 SPDY 協議的客戶端還是走 HTTP 協議,所以看到的響應頭是常規的。

Nginx 的這個做法是否合適一直有爭論,實際上并不是所有支持 SPDY 的 Web Server 都會這么做。例如即使通過 SPDY 協議訪問 Google 首頁的 js 文件,依然可以看到 vary: Accept-Encoding:

HTTP/1.1 200 OK
status: 200 OK
version: HTTP/1.1
age: 25762
alternate-protocol: 443:quic
cache-control: public, max-age=31536000
content-encoding: gzip
content-length: 154614
content-type: text/javascript; charset=UTF-8
date: Tue, 31 Dec 2013 23:23:51 GMT
expires: Wed, 31 Dec 2014 23:23:51 GMT
last-modified: Mon, 16 Dec 2013 21:54:35 GMT
server: sffe
vary: Accept-Encoding
x-content-type-options: nosniff
x-xss-protection: 1; mode=block

另外,現階段 Chrome 和 Firefox 都支持 SPDY 協議,但 PageSpeed Chrome 版和 Firefox 版都沒有針對 SPDY 協議做特別處理,所以用它們測試我的博客,還是會提示「Specify a Vary: Accept-Encoding header」,這有點讓人哭笑不得。不過 PageSpeed 在線版 已經更新規則,估計擴展版也快了。如果你有潔癖,可以在 Nginx 配置里加上「add_header vary accept-encoding;」手動輸出 Vary 響應頭。

責任編輯:何妍 來源: Jerry Qu的小站
相關推薦

2015-09-16 13:11:52

Http網絡協議Proxy-Conne

2015-09-17 10:29:07

Http網絡協議X-Forwarded

2015-09-29 14:01:45

SPDY網絡協議響應頭網絡協議

2015-09-15 13:48:01

網絡協議HTTP Client

2015-09-15 15:20:35

2010-06-08 11:25:01

HTTP協議通用頭域

2010-07-06 16:19:02

協議封裝

2010-06-21 15:06:45

AMF協議

2010-07-08 13:23:14

SAN路由協議

2010-07-08 14:25:12

HART協議

2010-06-21 17:55:24

RIP協議

2021-01-11 05:40:18

HTTPHTTP 協議網絡技術

2018-07-12 15:30:03

HTTP緩存機制

2015-09-07 13:52:04

2015-09-06 13:40:02

HTTP網絡協議

2015-09-08 10:06:15

2015-10-20 09:46:33

HTTP網絡協議

2015-09-06 10:54:29

HTTP網絡協議

2018-07-23 15:28:29

HTTPCookieHeader

2018-06-27 15:14:31

HTTP編碼內容
點贊
收藏

51CTO技術棧公眾號

国产精品影视在线观看| 国产精品99久久久久久董美香 | 精品一区二区三区中文字幕在线 | 一区二区三区视频| av av片在线看| 夜夜嗨av一区二区三区网站四季av| 国产婷婷成人久久av免费高清| 性欧美极品xxxx欧美一区二区| 国产在线1区| av电影在线观看一区| 国产精品久久久久久久一区探花| 特级片在线观看| 网友自拍一区| 3751色影院一区二区三区| 日本福利视频在线| 成人短视频在线| 久久久久久久久久电影| 99久久国产免费免费| 亚洲视频 欧美视频| 欧美91视频| 在线精品国产欧美| 中文字幕乱码在线| 国产一区二区三区国产精品| 日韩人在线观看| 国产91视频一区| 欧美女v视频| 国产suv精品一区二区883| 国产精品无码专区在线观看| 日韩视频免费观看高清| 欧美88av| 久久夜色精品亚洲噜噜国产mv| 国产欧美在线播放| 福利在线一区二区| 欧美另类极品| 欧美高清在线精品一区| 老司机精品福利在线观看| 亚洲精品久久久蜜桃动漫| 久久av中文字幕片| 国产精品视频区1| 日本午夜视频在线观看| 激情综合视频| 欧美激情一二三| 免费在线黄色网| 99久久夜色精品国产亚洲狼| 一夜七次郎国产精品亚洲| 风间由美一二三区av片| 久久男人av| 亚洲第一男人天堂| www.黄色网| 韩国一区二区三区视频| 91精品国产91热久久久做人人| 第四色婷婷基地| 91在线成人| 欧美日韩综合在线| 91制片厂毛片| 欧美高清xxx| 欧美精品免费视频| 高潮一区二区三区| 农村妇女一区二区| 欧美二区三区的天堂| 亚洲一区日韩精品| 99国内精品久久久久| 欧美男男青年gay1069videost| 人人干人人干人人| 日韩深夜福利网站| 欧美人与性动xxxx| 久久黄色一级视频| 国产厕拍一区| 国产精品熟女久久久久久| 久香视频在线观看| 91麻豆精品在线观看| 蜜桃成人免费视频| 国产裸舞福利在线视频合集| 国产一区二区三区亚洲综合| 美女航空一级毛片在线播放| 美女任你摸久久| 国产精品老女人精品视频| 在线观看不卡的av| 国产精品一区二区免费不卡| 成人区精品一区二区| 午夜视频福利在线| 欧美激情一区三区| 免费观看中文字幕| 国产网站在线| 欧美在线|欧美| 五月天六月丁香| 欧美激情影院| 中文在线资源观看视频网站免费不卡| 日日碰狠狠添天天爽| 国户精品久久久久久久久久久不卡| 久久久久亚洲精品国产| 亚洲影院在线播放| 激情综合色综合久久| 国产精品免费观看高清| 久久久久久久影视| 亚洲精品美国一| 男人天堂999| 涩涩涩久久久成人精品| 精品成人一区二区三区| 国产18无套直看片| 精品91视频| 国产精品稀缺呦系列在线| www.热久久| 国产三级精品在线| 精品无码国产一区二区三区av| 欧美韩国亚洲| 精品欧美一区二区三区精品久久| 加勒比综合在线| 天天av综合| 国产99久久精品一区二区 夜夜躁日日躁 | 嫩草影院一区二区三区| 国产精品18久久久久久久久 | 欧洲乱码伦视频免费| 欧美夫妻性生活视频| 亚洲中文一区二区| 不卡的av电影| 青少年xxxxx性开放hg| 综合在线影院| 国产精品15p| 欧美影视一区在线| 亚洲av人人澡人人爽人人夜夜| 日韩欧美1区| 清纯唯美亚洲激情| 国产91免费看| 亚洲欧美成人一区二区三区| wwwwxxxx日韩| 亚洲动漫在线观看| 午夜精品福利在线观看| 精品人妻一区二区三区三区四区 | 蜜桃传媒一区二区亚洲| 99日韩精品| 国产精品一国产精品最新章节| 九义人在线观看完整免费版电视剧| 欧美性xxxxx| 91玉足脚交白嫩脚丫| 欧美日韩 国产精品| 91系列在线播放| 欧美精品电影| 欧美色倩网站大全免费| 欧美丰满美乳xxⅹ高潮www| 国产精品尤物| 久久精品国产一区二区三区日韩| 欧美14一18处毛片| 日韩欧美国产成人一区二区| 男女性高潮免费网站| 国产一区二区91| 91麻豆天美传媒在线| 精品一区91| 欧美大片va欧美在线播放| 国产精品呻吟久久| 亚洲欧美日韩久久| 国内av免费观看| 欧美日韩蜜桃| 国产一区二区三区免费不卡| 四季久久免费一区二区三区四区| 日韩视频永久免费| 久久久久久久久久久网 | 色先锋资源久久综合| 中文字幕国产专区| 丝袜诱惑制服诱惑色一区在线观看| 看欧美日韩国产| 日本免费久久| 中文字幕亚洲第一| 国产麻豆免费视频| 亚洲一区二区成人在线观看| 亚洲熟女一区二区| 久久精品一区二区国产| 久久精品一二三| 欧美成人免费在线| 欧美暴力调教| 精品国产自在精品国产浪潮 | h片在线观看| 亚洲国产日韩一区| 中文字幕第一页在线播放| 日韩一区中文字幕| 日本精品一二三区| 老司机午夜精品视频| 亚洲一区在线直播| 亚洲日本视频在线| 国产成人一区二| 黄色的网站在线观看| 精品国产露脸精彩对白| 亚洲视频 欧美视频| 亚洲欧美日韩精品久久久久| 中文字幕人妻熟女在线| 日日骚欧美日韩| 亚洲免费视频播放| 亚洲第一论坛sis| 成人欧美一区二区三区在线| 欧美gv在线观看| xxxxx成人.com| 囯产精品一品二区三区| 色偷偷一区二区三区| 日韩在线中文字幕视频| 久久久欧美精品sm网站| 男插女视频网站| 久久一二三四| 91网站在线观看免费| 精品视频日韩| 国产精品一区二区a| 日韩福利影视| 777精品视频| 国产美女在线观看| 亚洲男子天堂网| 国产成人久久精品77777综合 | 亚洲天堂网在线观看视频| 亚洲一区在线观看免费观看电影高清| 男生草女生视频| 高清久久久久久| 中文字幕在线综合| 国产日韩欧美一区| 麻豆映画在线观看| 日韩系列欧美系列| 欧美不卡在线一区二区三区| 久久久久毛片免费观看| 国产精品99久久久久久白浆小说| 国产白丝在线观看| 美女久久久久久久久久久| 国产黄色免费在线观看| 亚洲精品久久视频| 久久久久久九九九九| 操你啦视频在线| 国产亚洲精品va在线观看| 日批免费在线观看| 日韩欧美一级片| 国产精品无码在线播放| 欧美这里有精品| 伊人久久久久久久久久久久| 性做久久久久久免费观看| 草视频在线观看| √…a在线天堂一区| 99在线视频免费| 久久―日本道色综合久久| 国产a级黄色片| 夫妻av一区二区| 亚洲区 欧美区| 国产精品一区二区视频| 在线一区二区不卡| 久99久精品视频免费观看| 天堂av在线网站| 三级不卡在线观看| 北条麻妃视频在线| 日韩精品成人一区二区在线| 国产真实乱子伦| 欧美在线综合| 欧美日韩第二页| 久久一区亚洲| 美女黄色片视频| 免费久久99精品国产| 三级视频中文字幕| 久久福利资源站| 手机精品视频在线| 国产成人午夜片在线观看高清观看| 91丨porny丨九色| 国产福利一区在线| 日本人妻一区二区三区| 99久久婷婷国产| 亚洲精品乱码久久久久久不卡| 9l国产精品久久久久麻豆| 三叶草欧洲码在线| 国产欧美日韩综合精品一区二区| 国产极品视频在线观看| 中文字幕亚洲精品在线观看 | 精品国产一区二区三区噜噜噜 | 一区二区电影在线观看| 狠狠干视频网站| 影音先锋久久精品| 97在线播放视频| 日本伊人精品一区二区三区观看方式| 亚洲一区在线不卡| 国产一区二区日韩精品| wwwxx日本| 久久久www成人免费无遮挡大片| 久久精品三级视频| 亚洲美女淫视频| av中文在线播放| 欧美视频一区在线观看| 国产ts人妖调教重口男| 日韩电影视频免费| 精品一区二区久久久久久久网站| 久久婷婷五月综合色丁香| 亚洲自拍小视频免费观看| 国产调教精品| 日韩国产精品一区二区| 亚洲自拍偷拍网| 777精品久无码人妻蜜桃| 强制捆绑调教一区二区| 极品人妻一区二区| 国产婷婷色一区二区三区在线| 黄色录像二级片| 欧美日韩另类字幕中文| 一区二区视频网站| 欧美精品一区二区三区久久久| 国产中文字幕在线播放| 色综合天天狠天天透天天伊人| 黑人巨大精品| 超碰在线97av| 色男人天堂综合再现| 99视频在线免费播放| 久久国产福利国产秒拍| 中文字幕免费看| 亚洲一区二区影院| 亚洲精品91天天久久人人| 精品国产sm最大网站免费看| 91在线视频| 78色国产精品| 欧美国产中文高清| 日韩片电影在线免费观看| 亚洲激情在线| 午夜大片在线观看| 久久久国际精品| 国产精品自拍视频一区| 91精品国产综合久久婷婷香蕉| 男生女生差差差的视频在线观看| 色综合天天狠天天透天天伊人| 久久不卡日韩美女| 日韩精品欧美一区二区三区| 91久久综合| 日韩精品国产一区| 亚洲欧美一区二区在线观看| 日韩不卡高清视频| 亚洲老板91色精品久久| 国产经典三级在线| 91久久精品国产91久久性色tv| 青青一区二区三区| 已婚少妇美妙人妻系列| www国产精品av| 日韩欧美亚洲一区二区三区| 日韩精品一区二区三区视频| av在线免费网址| 91精品久久久久久久久不口人| 国产精品日韩精品中文字幕| 国产视频一视频二| av电影一区二区| 日韩精品在线免费看| 日韩天堂在线观看| 羞羞电影在线观看www| 91免费观看网站| 亚洲国产老妈| 一级做a爱视频| 亚洲精品亚洲人成人网在线播放| 国产又爽又黄免费软件| www.亚洲天堂| av日韩一区| 在线观看成人免费| 国产精品一区二区黑丝| 五月天丁香激情| 国产欧美精品一区| 9a蜜桃久久久久久免费| 国产尤物久久久| 日韩一级片播放| 国产欧美一区二区在线| 精品国产www| 精品国产欧美一区二区三区成人| 亚州精品国产| 可以在线看黄的网站| 国产suv精品一区二区6| 日本一区二区三区四区五区| 亚洲护士老师的毛茸茸最新章节| 人成在线免费网站| 欧美最大成人综合网| 日本va欧美va精品| 北条麻妃在线观看视频| 欧美一区二区福利视频| 高清电影在线观看免费| 国产综合精品一区二区三区| 久久www成人_看片免费不卡| 91精品国自产在线| 精品视频资源站| 在线你懂的视频| 国产区日韩欧美| 久久永久免费| 一区二区国产精品精华液| 精品国产伦一区二区三区观看体验 | 国产精品国产三级国产专区52| 亚洲深夜福利网站| 国产aa精品| 99久久国产综合精品五月天喷水| 91在线视频观看| 一本色道久久综合熟妇| 欧美激情一区二区三区久久久| 日本国产精品| 成人日韩在线视频| 亚洲午夜久久久久久久久电影网 | av爱爱亚洲一区| 久久国产香蕉视频| 欧美激情免费视频| 欧美猛男做受videos| 美女被艹视频网站| 色综合色狠狠天天综合色| 黄色在线免费看| 另类小说综合网| 国产一区二区电影| 日韩三级一区二区| 欧美国产视频日韩| 精品日本12videosex| 99re这里只有| 51精品久久久久久久蜜臀| 中文字幕乱码中文乱码51精品| 中文字幕中文字幕一区三区|