一、概念
apache在响应头中返回了一个vary:Accept-encoding ,则squid在存储缓存文件时需要将“我的浏览器”发出的请求头信息中的Accept-encoding字段的值(大多情况就是gzip,deflate之类的)作为缓存key的一部分,因此对于不同的Accept-encoding字段值,都需要保存不同的文件。
二、请求阶段
在通过key值获取到缓存文件后(ngx_http_file_cache_read),如果缓存头包含vary信息,则计算该请求的variant,如果计算结果和缓存头中的variant值不一致,说明该节点不匹配。需要将variant值作为key,重新查找缓存节点(如果不存在则新建节点,将variant保存为key)。并设置r->cache->secondary位,表明该请求的是一个variant变化了的节点。
if (h->vary_len) {
/*根据缓存文件保存的响应vary信息,计算请求的variant值*/
ngx_http_file_cache_vary(r, h->vary, h->vary_len, c->variant);
/*如果variant值不匹配,说明该缓存节点不要要找的。将variant作为key,查找新的缓存节点*/
if (ngx_memcmp(c->variant, h->variant, NGX_HTTP_CACHE_KEY_LEN) != 0) {
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http file cache vary mismatch");
return ngx_http_file_cache_reopen(r, c);
}
}
三、响应阶段(ngx_http_file_cache_set_header)
/*根据响应vary和请求,生成variant*/
if (!c->secondary) {
return NGX_OK;
}
/*如果新生成的variant,和保存的key(实际是旧节点的variant)一致,
则说明响应vary未变化,只是请求variant发生变化,那么保存该variant作为key的节点。否则,说明
响应vary发生了变化,更新旧节点*/
if (c->vary.len
&& ngx_memcmp(c->variant, c->key, NGX_HTTP_CACHE_KEY_LEN) == 0)
{
return NGX_OK;
}