关于squid请求源服务器的响应中带Vary头
1. 源服务器返回的响应头不带”Vary: Accept-Encoding”
不管客户端请求头中带不带”Accept-Encoding: gzip,deflate”,squid会只缓存一份对象
1)如果第一个MISS的请求,客户端请求头中带”Accept-Encoding: gzip,deflate”。
源服务器会返回带gzip压缩的对象给squid,squid会把这个gzip压缩之后的对象保存下来。
以后不管客户端的请求头中是否带”Accept-Encoding: gzip,deflate”,都会把这个gzip的对象返回给client。
2)如果第一个MISS的请求,客户端请求头中不带”Accept-Encoding: gzip,deflate”。
源服务器会返回不压缩的对象给squid,squid会把这个没经过压缩的对象保存下来。
以后不管客户端的请求头中是否带”Accept-Encoding: gzip,deflate”,都会把这个没压缩的对象返回给client。
2. 源服务器返回的响应头中带”Vary: Accept-Encoding”
squid会根据客户端每次不同的请求头中”Accept-Encoding”包含的值,squid会缓存多份对象,可能每份对象都相同。
1)客户端请求头中不带”Accept-Encoding”。squid先判断是否存在以url为key的StoreENtry。
2)如果不存在,squid请求原服务器,源服务器会返回一个不带压缩的对象给squid,squid会把这个没经过压缩之后的对象保存下来。
存放的时候squid先创建一个StoreEntry(VaryData)对象,对象的http响应头是squid内部对象头,对象body部分保存这个url包含不同的
accept-encoding值和这个值对应的StoreEntry的KEY。
00002472 48 54 54 50 2f 31 2e 30 20 32 30 30 20 49 6e 74 |HTTP/1.0 200 Int|
00002482 65 72 6e 61 6c 20 6d 61 72 6b 65 72 20 6f 62 6a |ernal marker obj|
00002492 65 63 74 0d 0a 53 65 72 76 65 72 3a 20 73 71 75 |ect..Server: squ|
000024a2 69 64 0d 0a 44 61 74 65 3a 20 4d 6f 6e 2c 20 31 |id..Date: Mon, 1|
000024b2 34 20 4e 6f 76 20 32 30 31 31 20 30 38 3a 35 30 |4 Nov 2011 08:50|
000024c2 3a 30 39 20 47 4d 54 0d 0a 43 6f 6e 74 65 6e 74 |:09 GMT..Content|
000024d2 2d 54 79 70 65 3a 20 78 2d 73 71 75 69 64 2d 69 |-Type: x-squid-i|
000024e2 6e 74 65 72 6e 61 6c 2f 76 61 72 79 0d 0a 45 78 |nternal/vary..Ex|
000024f2 70 69 72 65 73 3a 20 54 75 65 2c 20 31 35 20 4e |pires: Tue, 15 N|
00002502 6f 76 20 32 30 31 31 20 31 32 3a 33 36 3a 34 39 |ov 2011 12:36:49|
00002512 20 47 4d 54 0d 0a 56 61 72 79 3a 20 41 63 63 65 | GMT..Vary: Acce|
00002522 70 74 2d 45 6e 63 6f 64 69 6e 67 0d 0a 0d 0a 4b |pt-Encoding….K|
00002532 65 79 3a 20 44 39 37 31 34 31 44 30 31 39 39 45 |ey: D97141D0199E|
00002542 45 36 31 31 0a 56 61 72 79 44 61 74 61 3a 20 61 |E611.VaryData: a|
00002552 63 63 65 70 74 2d 65 6e 63 6f 64 69 6e 67 3d 22 |ccept-encoding=”|
00002562 67 7a 69 70 2c 64 65 66 6c 61 74 65 22 0a 4b 65 |gzip,deflate”.Ke|
00002572 79 3a 20 31 42 31 43 32 31 34 34 44 38 38 30 36 |y: 1B1C2144D8806|
00002582 46 35 32 0a 56 61 72 79 44 61 74 61 3a 20 61 63 |F52.VaryData: ac|
00002592 63 65 70 74 2d 65 6e 63 6f 64 69 6e 67 3d 22 67 |cept-encoding=”g|
000025a2 7a 69 70 2c 64 65 66 6c 61 74 65 2c 73 64 63 68 |zip,deflate,sdch|
000025b2 22 0a 4b 65 79 3a 20 32 39 38 37 36 32 46 45 30 |”.Key: 298762FE0|
000025c2 37 46 33 30 42 35 39 0a 56 61 72 79 44 61 74 61 |7F30B59.VaryData|
000025d2 3a 20 61 63 63 65 70 74 2d 65 6e 63 6f 64 69 6e |: accept-encodin|
000025e2 67 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |g……………|
把这个创建好的StoreEntry(VaryData)内部对象保存到磁盘之后,squid再把从源服务器取回来的对象数据保存到根据url和”accept-encoding=value”产生的hash_key对象中。
3)假设请求头中包含”Accept-Encoding: gzip,deflate”,如果squid查找url对应的StoreEntry(VaryData)对象的数据存在。
squid读取磁盘中的StoreEntry对象,判断是VaryData对象,解析VaryData对象中包含的”accept-encoding=value”和对应的Key。
a)如果请求有匹配的”Accept-Encoding: gzip,deflate”,读取”Accept-Encoding: gzip,deflate”对应的Key的StoreEntry数据返回给客户端。
按照上面给出的Accept-Encoding: gzip,deflate对应的Key:298762FE07F30B59,那么返回hash_key: 298762FE07F30B59对应的StoreEnty。
b)如果没有匹配的”Accept-Encoding: gzip,deflate”,squid去源服务器取数据(”Accept-Encoding: gzip,deflate”请求头),
创建StoreEntry,把”Accept-Encoding: gzip,deflate”和key对应的值添加到VaryData中,写新的VaryData到新的文件里面,删除原来的文件。
把从源服务器取来的数据写到新的StoreEntry中。