原文出自http://mark.koli.ch/2010/09/understanding-the-http-vary-header-and-caching-proxies-squid-etc.html
作者是Mark S. Kolich

就是简单的对vary进行一下介绍,方便大家理解,下面是一个简单的翻译

我从来没有过多关注http的vary header。事实上,我非常幸运在过去的很长时间避开了它给我带来的问题,所以就没引起我的关注,但是,如果你最终要配置一个高性能的反向代理服务器,那么理解vary header并且它对于你的缓存策略意味着什么事非常有必要的。
下面是一个关于我最近处理关于squid,apache的一个有趣的问题,并且这个问题很难找出竟然是和vary response header有关。

1 关于vary的一些基本信息

流行的缓存代理服务器,像squid,通常会根据请求的URI和vary response header的内容产生一个hash值。当缓存服务器接收到一个请求的时候,它会根据输入产生一个hash,之后检查缓存看是否已经有这个资源在硬盘上或者在内存中匹配这个hash值。缓存服务器以此来判断命中与否。
而vary response header告诉缓存服务器使用什么判断一个请求的资源是fresh还是stale的,一个简单的vary header包括:
Vary: Accept-Encoding
Vary: Accept-Encoding,User-Agent
Vary: X-Some-Custom-Header,Host
Vary: * 

  

根据http标准,vary 的值表明需要哪些request header去充分决定一个response是否是fresh的,缓存服务器是否可以不用重新确认就使用一个reponse。

2 缓存遇到的问题

我配置squid作为一个轮询的负载均衡服务器和一个反向代理缓存服务器,在apache服务器的前面,每个apache服务器都运行着我的web应用,我严格配置squid缓存.json文件24个小时。
我打开了一个web浏览器,我访问了一个我认为已经被缓存的URL。
GET /path/big.json HTTP/1.1
Host: app.kolich.local
User-Agent: Firefox HTTP/1.0 200 OK
Date: Fri, 24 Sep 2010 23:09:32 GMT
Content-Type: application/json;charset=UTF-8
Content-Language: en-US
Vary: Accept-Encoding,User-Agent
Age: 1235
X-Cache: HIT from cache.kolich.local
X-Cache-Lookup: HIT from cache.kolich.local:80
Content-Length: 25090
Connection: close 

很好,它已经被缓存了,然后我在另一台机器上打开了第二个web浏览器(注:是一个不同类型的浏览器),这一次,注意一下X-Cache:MISS
GET /path/big.json HTTP/1.1
Host: app.kolich.local
User-Agent: Chrome HTTP/1.0 200 OK
Date: Fri, 24 Sep 2010 23:11:45 GMT
Content-Type: application/json;charset=UTF-8
Content-Language: en-US
Vary: Accept-Encoding,User-Agent
Age: 4
X-Cache: MISS from cache.kolich.local
X-Cache-Lookup: MISS from cache.kolich.local:80
Content-Length: 25090
Connection: close 

wow,看看它,我请求了一个完全一样的资源,只是从一个不同的浏览器上,现在我看到了一个MISS。这肯定不是我想看到的结果,我当然需要需要同样的缓存对象而无论到底是谁请求了这个资源。如果就这样放着的话,这个缓存服务器只会是一个每一个浏览器都会有一份拷贝的缓存,而不是一个全局的缓存。

3 解决方案,检查你的vary header

观察上面两个请求,注意User-Agent header和Vary header,虽然两个请求都是请求同一个资源,但是squid把这个两个请求看做是不同的了,这是怎么发生的呢,我们看一下Vary header:
Vary: Accept-Encoding,User-Agent 

它告诉squid请求的URI,Accept-Encoding header和User-Agent header应该包括在hash值内去决定在缓存上的对象是可用的。很明显的,任何一个(URI, Accept-Encoding,"Firefox")组合的hash值和(URI, Accept-Encoding, "Chrome")组合产生的hash值都是不匹配的,所以squid才认为这两个请求是请求不同的内容的。
为了解决这个问题,我找到了烦人的附加在我的Vary response header上的User-Agent是从哪来的,原来是在apache自带的mod_deflate模块,推荐的mod_deflate的配置包括如果一个response没有被mod_deflate压缩话就默认附加User-Agent在Vary header后面。这是推荐的apache配置中关于mod_deflate的相关行:
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary 

我删除掉了上面的这两行,重启了apache然后squid会忽略掉请求的浏览器客户端的类型。本质上说,我通过移除Vary header中的User-Agent告诉squid不要再去关心用户的浏览器类型,然后问题就解决了。

转载自http://shunter.blog.51cto.com/2183398/1076521

转载于:https://www.cnblogs.com/engeng/articles/5981582.html

http请求报文头部vary信息相关推荐

  1. 实现免密登录,设置只允许student1, student2用户登录,get和post的区别,HTTP状态码,HTTP请求报文和响应报文,HTTP是如何保持连接状态的

    1.实现免密登录 1创建密钥 [root@192 /]# su gzw [gzw@192 /]$ cd /home/gzw/.ssh [gzw@192 .ssh]$ ssh-keygen -t rsa ...

  2. HTTP 请求报文和响应报文包括哪些内容?

    1. 请求报文 客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端. 请求报文结构: 第一行是包含了请求方法.URL.协议版本: 接下来的多行都 ...

  3. HTTP请求/响应报文头部结构

    HTTP请求 一个HTTP请求由四个部分组成:请求行.请求头部.空行.请求数据. -请求行 请求行由请求方法字段.URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔.比如 GET /data ...

  4. 【计算机网络】常见的HTTP报文头部信息

    常见的HTTP报文头部信息 HTTP首部字段根据实际用途被分为以下4种类型. 1.通用首部 通用首部字段(General Header Fields)请求报文和响应报文两方都会使用的首部. Cache ...

  5. linux抓取tcp报文头部,3.2.3 使用tcpdump观察TCP头部信息

    3.2.3 使用tcpdump观察TCP头部信息 在2.3节中,我们利用tcpdump抓取了一个数据包并分析了其中的IP头部信息,本节分析其中与TCP协议相关的部分(后面的分析中,我们将所有tcpdu ...

  6. HTTP请求报文和响应报文信息

    例子: [请求报文] GET / HTTP/1.1 Host: www.enjoytoday.cn Connection: keep-alive Upgrade-Insecure-Requests: ...

  7. http详解 请求报文格式和响应报文格式

    题外话: <Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元>相信过去BTC的人,信不信未来的PI,了解一下,唯一一个高度与之持平的项目 HTTP 工作原理 超文本传 ...

  8. HTTP的请求报文与响应报文

    报文: 简单来说,报文就是也就是HTTP报文,作用是在各个系统之间进行和响应时用来交换与传输的数据单元,即站点一次性要发送的数据块,这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义 ...

  9. HTTP协议浅析(中):请求报文和响应报文

    1. 请求报文格式 1.1 服务器测试代码 服务器测试代码: #include <stdio.h> #include <stdlib.h> #include <strin ...

最新文章

  1. Android开发中使用七牛云存储进行图片上传下载
  2. BZOJ-3289-Mato的文件管理-莫队+树状数组
  3. matlab给定四点求交点,Matlab有关曲线求交点程序分享
  4. windows使用nginx实现网站负载均衡测试实例
  5. linux中安装软件,查看、卸载已安装软件方法
  6. bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP
  7. JAVA入门级教学之(char类型)
  8. MinGW 64的安装 - 官网sourceforge安装失败非翻墙解决办法
  9. 火车在提速,生活在加速,快节奏的生活让人们逐渐失去了驻足思考的能力,人们好像已经习惯抱团去做某一件事情,完全不顾这件事情到底适合不适合自己,我在想他们总...
  10. 【图像跟踪】基于matlab GUI均值漂移图像跟踪【含Matlab源码 743期】
  11. 如何将内网ip映射到外网
  12. 编码表(ASCII码GB2312gbkunicodeUTF-8)
  13. go项目实战 <微信公众号后台开发>(一、获取token)
  14. Python实现简单的excel对比工具
  15. 20145201 《信息安全系统设计基础》期中总结
  16. python随机生成4位验证码并判断是否正确_利用Python生成随机4位验证码
  17. Apache 安装虚拟主机
  18. 读《曾国藩》笔记2--慈不掌兵
  19. 合并的表格怎么加横线_word怎么合并表格边框
  20. Set集合之TreeSet

热门文章

  1. JSON.parse 转换字符串样式的数组
  2. Ubuntu16.04 安装配置深度学习配置:GPU加速 Cuda+cudnn+opencv+caffe
  3. Android实现APK智能安装且安装后自启动,亲测有用!
  4. 老毛桃重启计算机没反应,老毛桃怎么用
  5. sec和asec--正割和反正割函数
  6. Zabbix基于Dell系统管理OMSA监控物理服务器硬件
  7. opencv 鼠标绘图
  8. 【神兵利器】你是否也想生成这样有逼格的代码图?
  9. 服务器修改mysql登录密码忘了怎么办,云服务器mysql密码重置密码忘记了
  10. 光纤通信工程-波分复用DWDM(十一)