网上有朋友遇到Squid关于Vary头缓存问题,查了下以前的笔记:

一、现象

如需要缓存Vary头信息的Object,同一个URL,Squid会根据 Vary头定义的Request头信息 来缓存多份,而在做缓存刷新的时候,这些多的Object会删不干净(算是Bug)


关于Squid 的Vary缓存原理解释在这儿: http://blog.sina.com.cn/s/blog_68d83f050100m3x1.html

二、解决办法

1 目前 可以通过修改Squid源码来达到目的
已经有人在Squid2.6下测试成功: http://windtear.net/2008/07/squid_patch_accept-encoding_multi_cache.html 


我测试过Sina的相关 缓存,无论在请求头中怎么修改,得到的缓存都一样
比如: 
curl  -H "Accept-Encoding: gzip,deflate"  ;  
curl  -H "Accept-Encoding: deflate,gzip"  ;
curl  -H "Accept-Encoding: deflate , gzip"  ;


2 有同事(在淘宝的) 提供了一个方法:cur -X PURGE -H "Accept-Encoding: gzip,deflate" http://xxxx/yyyy.jpg 可以删掉
但这不是完美的方案 。理论上"Accept-Encoding" 的Value 可以有很多(所以才会有多份缓存),Squid还是应该提供完全的解决方案