精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

午夜精产品一区二区在线观看的| www.九色.com| 一本色道久久综合亚洲| 亚洲天天综合| 日韩av中文在线| 色婷婷成人在线| 免费看电影在线| 久久精品亚洲一区二区三区浴池| 成人两性免费视频| 97人人澡人人爽人人模亚洲 | 亚洲图片中文字幕| 亚洲国产精品成人| 亚洲人成77777在线观看网| 999久久久精品视频| 亚洲性受xxx喷奶水| 亚洲人成7777| 日本一区不卡| 深夜福利视频网站| 黄网站免费久久| 日本国产欧美一区二区三区| 欧美日韩免费做爰视频| 欧美在线免费看视频| 亚洲成人网av| 99热这里只有精品2| 久久野战av| 亚洲成人激情综合网| 宅男一区二区三区| 男人的天堂在线视频| 国产91在线观看| 91亚洲一区精品| 中文无码av一区二区三区| 在线亚洲观看| 欧美肥臀大乳一区二区免费视频| 99精品欧美一区二区| 外国成人在线视频| 亚洲国产中文字幕久久网| 丰满少妇中文字幕| 成人国产精品久久| 欧美日韩精品高清| 人妻无码视频一区二区三区| 筱崎爱全乳无删减在线观看| 亚洲一区av在线| 国产人妻人伦精品| 成人在线视频亚洲| 亚洲丝袜自拍清纯另类| 这里只有精品66| 在线观看h片| 国产免费久久精品| 色播五月综合| av在线资源网| 中文一区在线播放| 日韩欧美精品久久| 国产鲁鲁视频在线观看免费| 久久精品视频在线免费观看 | 亚洲欧美综合一区二区| youjizz久久| 黑人另类av| 亚洲欧洲国产综合| 久久人人97超碰com| 日本在线观看一区| 东热在线免费视频| 国产精品久久久久精k8| 中文字幕av日韩精品| 拍真实国产伦偷精品| 最新日韩av在线| 日韩专区第三页| av在线网页| 好吊成人免视频| 无遮挡又爽又刺激的视频| 成人免费av电影| 在线91免费看| 超级砰砰砰97免费观看最新一期| 77成人影视| 日韩精品视频在线| 亚洲精品成人无码| 日韩欧美精品综合| 九九九久久国产免费| 日本系列第一页| 久热re这里精品视频在线6| 国产精品日本精品| 亚洲春色一区二区三区| 99久久亚洲一区二区三区青草| 久久天天狠狠| 精品自拍一区| 亚洲成a人片在线不卡一二三区 | 一本一道久久久a久久久精品91| 黄在线免费看| 亚洲高清免费观看 | 国产精品16p| 久久久噜噜噜| 91深夜福利视频| 三级小视频在线观看| 久久精品人人做人人综合| 一区二区三区一级片| 草草在线观看| 欧美日韩另类一区| 800av在线播放| 日本欧美视频| 海角国产乱辈乱精品视频| 波多野结衣啪啪| 国产一区二区调教| 欧美裸体网站| 青草影视电视剧免费播放在线观看| 欧美性猛交xxxx乱大交| 午夜精品免费看| 日韩深夜影院| 色综合久综合久久综合久鬼88| 亚洲欧美一二三区| 国产精品888| 亚洲精美视频| a欧美人片人妖| 日韩一区二区三区在线视频| 男人的天堂av网| 亚洲理伦在线| 99电影在线观看| 9191在线| 在线亚洲欧美专区二区| 中文字幕天堂网| 性欧美69xoxoxoxo| 国产99久久精品一区二区| 好吊视频一二三区| 日韩理论在线观看| 国产视频一区二区视频| 久久婷婷国产| 欧美黑人又粗大| 国产女人爽到高潮a毛片| 亚洲国产精品t66y| 日韩有码免费视频| 天美av一区二区三区久久| 欧美激情图片区| 99久久久无码国产精品免费| 国产精品毛片久久久久久| 日本新janpanese乱熟| 亚洲精品国产精品粉嫩| 2023亚洲男人天堂| 天天综合永久入口| 午夜伦欧美伦电影理论片| 午夜性福利视频| 91精品91| 91视频最新| 午夜伦理大片视频在线观看| 欧美福利一区二区| 超碰97av在线| 毛片不卡一区二区| 综合一区中文字幕| 亚洲欧美专区| 久久伊人免费视频| 国产视频第一页| 亚洲精品中文字幕在线观看| 韩国一区二区在线播放| 中文字幕亚洲精品乱码| 91久久国产综合久久蜜月精品| 中文字幕中文字幕在线十八区| 日韩一本二本av| 欧美成人综合色| 高清不卡一区二区| 日韩xxxx视频| 伊人久久大香线蕉av不卡| 国产精品高潮粉嫩av| 二区三区在线播放| 欧美日本在线观看| 欧美又粗又大又长| 成人丝袜18视频在线观看| 福利视频一二区| 亚洲精华一区二区三区| 亚洲va欧美va人人爽午夜| 国产69久久精品成人| 色综合免费视频| 日韩欧美在线观看| 人妻无码一区二区三区免费| 激情综合五月天| www.一区二区.com| 婷婷成人综合| 国产精品嫩草视频| 影院在线观看全集免费观看| 亚洲精品在线观看网站| 手机看片久久久| 1000部国产精品成人观看| 国产精品99精品无码视亚| 夜夜嗨网站十八久久| 日韩中文不卡| 亚洲国产精品免费视频| 韩国三级日本三级少妇99| 青春草在线观看| 欧美日韩国产另类一区| 国产精品成人aaaa在线| 国产午夜精品一区二区三区视频| 天天干天天操天天做| 尤物在线精品| 亚洲精品8mav| 欧美日韩大片免费观看| 国产日韩欧美在线| 91av久久| 日韩在线视频免费观看| 天堂在线视频观看| 欧美日韩卡一卡二| 日韩黄色一级大片| 亚洲天堂2014| 日本免费www| 成人自拍视频在线| 不卡的在线视频| 香蕉久久久久久久av网站| 婷婷视频在线播放| 国产日韩欧美一区二区三区| 爱情岛论坛亚洲入口| 亚洲成人不卡| 8050国产精品久久久久久| 精精国产xxxx视频在线| 亚洲人成网站在线播| 好男人在线视频www| 欧美二区在线观看| 日本黄色一级视频| 亚洲一线二线三线视频| 999精品在线视频| 久久久99免费| 亚洲天堂资源在线| 国产精品小仙女| 国产视频1区2区3区| 亚洲欧美日韩国产一区| 成人午夜视频在线观看免费| 成人在线国产| 免费av在线一区二区| h视频久久久| 亚洲最大成人免费视频| 青娱乐极品盛宴一区二区| 国产成人福利网站| 日韩欧美精品一区二区三区| 欧美精品性视频| 麻豆网站视频在线观看| 中文字幕久精品免费视频| 欧美美乳在线| 精品视频www| 天天干天天操av| 精品福利在线导航| 亚洲AV无码精品自拍| 日韩一区二区三区视频在线观看| 国产露脸无套对白在线播放| 欧美久久久久久久久| 艳妇乳肉豪妇荡乳av| 欧美三区在线观看| 国产精品成人久久久| 欧美在线三级电影| 奴色虐av一区二区三区| 91久久国产最好的精华液| 中文字幕一区二区人妻视频| 91官网在线免费观看| 在线永久看片免费的视频| 色呦呦日韩精品| 九九热最新视频| 欧美日韩在线播放三区| 艳妇乳肉豪妇荡乳av| 在线成人免费视频| 99热这里只有精品66| 日韩你懂的在线观看| 亚洲高清在线观看视频| 亚洲高清av在线| 欧美日韩伦理片| 中文字幕无线精品亚洲乱码一区 | 欧美午夜精品理论片| 激情综合色综合久久| www.亚洲自拍| 粉嫩av一区二区三区在线播放| xfplay5566色资源网站| 99精品欧美一区二区三区小说| 精品无码人妻一区| 国产精品久久久久久久午夜片| 亚洲视频重口味| 亚洲一区自拍偷拍| 精品不卡一区二区| 欧美日韩精品一二三区| 精品国产无码一区二区三区| 日韩av有码在线| 成人免费在线电影| 欧美刺激性大交免费视频| 成人av影院在线观看| 国产成人高清激情视频在线观看 | 日韩女同互慰一区二区| 日韩精品视频无播放器在线看| 在线观看国产成人av片| 尤物在线网址| 8050国产精品久久久久久| 欧美爱爱视频| 国产伦精品一区二区三区照片 | av一本久道久久综合久久鬼色| 国产ts在线播放| 亚洲人被黑人高潮完整版| 中文字幕在线观看视频网站| 欧美日韩精品一区二区三区 | 中文字幕日本人妻久久久免费 | 老熟女高潮一区二区三区| 久久蜜桃一区二区| 乱h高h女3p含苞待放| 欧美视频中文字幕在线| 97人妻一区二区精品免费视频| 日韩av网站大全| 欧美激情免费| 日韩美女在线看| 国产精品色呦| 亚洲免费av网| 老司机精品视频网站| 久久久久国产免费| 中文字幕在线播放不卡一区| 亚洲一区欧美在线| 日韩一区二区三区在线| jizz在线观看视频| 97在线视频免费看| 成人黄色理论片| 亚洲国产一区二区在线| 国产农村妇女精品一区二区| 午夜免费福利网站| 久久久久成人黄色影片| 国产一级在线免费观看| 在线播放日韩导航| 男男激情在线| 97欧美精品一区二区三区| 国产一区二区高清在线| 台湾成人av| 国产手机视频一区二区 | 中文字幕在线播放日韩| 日韩精品欧美激情| 美女网站视频在线| 91久久久久久久久久久久久| 久久国产电影| 三级a在线观看| 久久在线观看免费| www成人在线| 亚洲激情成人网| 91九色porn在线资源| 国产精品v欧美精品v日韩精品| 在线国产一区| 91插插插影院| 亚洲视频狠狠干| 国产精品自产拍| 久久精品国产精品亚洲| 欧美亚洲二区| 杨幂一区欧美专区| 美国十次了思思久久精品导航| 国产又大又粗又爽的毛片| 色狠狠桃花综合| 国产永久免费高清在线观看 | 国产清纯白嫩初高生在线观看91| 五月婷婷激情网| 日韩高清a**址| 中文字幕在线中文字幕在线中三区| 精品久久一区二区三区蜜桃| 亚洲精品欧洲| 精品无码在线视频| 欧美日韩另类字幕中文| 三级无遮挡在线观看| 国产成人精品久久亚洲高清不卡| 国产va免费精品观看精品视频| 欧美日韩大尺度| 国产精品久久久久久久久图文区| 亚洲天堂2021av| 久热精品在线视频| 99这里只有精品视频| 波多野结衣乳巨码无在线| 91亚洲午夜精品久久久久久| 国产女主播喷水视频在线观看| 中文字幕欧美日韩va免费视频| 亚洲人成777| 日韩欧美视频免费在线观看| 99v久久综合狠狠综合久久| 中文字幕av影院| 啊v视频在线一区二区三区 | 丰满少妇乱子伦精品看片| 亚洲老司机av| 日日夜夜一区| 久久人人爽人人爽人人av| 97精品久久久久中文字幕| 伊人久久久久久久久久久久 | 日韩精品视频在线播放| 视频精品导航| 300部国产真实乱| 久久精品欧美日韩精品 | 国产高清不卡一区| 天天插天天操天天干| 日韩中文字幕精品| 久久久免费毛片| 午夜激情av在线| 亚洲一区在线观看视频| 精品av中文字幕在线毛片| 成人午夜激情网| 国产精品一级| 91高清免费观看| 亚洲国产一区二区三区网站| 性欧美.com| 成人性生交大合| 最近中文字幕免费观看| 欧美精品在线视频观看| 亚洲精华一区二区三区| 亚洲色图偷拍视频| 欧美日韩在线看| 操你啦在线视频| 欧美高清一区二区| 国产宾馆实践打屁股91| 中文字幕一区二区人妻痴汉电车| 久久久久久91| 99精品视频在线| 一区二区三区四区免费|