squid在max-age=0的情况下强制回源的问题


现在我们反向代理服务器准备用squid,起初设想的逻辑是这个样子的:让squid缓存源站的内容,如果源站的内容更新之后,手动调用一下脚本更新一下squid上的缓存,也就是执行类似这样一个命令: squidclient -h $squidIp -p $squidPort -m PURGE $http_url_to_refresh_cache 。但是发现当源站返回的响应头中包含 cache-control:max-age=0 问题就来了,squid对于这种请求,在刷新浏览器之后强制回源了,我们本想让浏览器和squid之间进行通信,不要进行回源,但是现在却事与愿违了。本来我们是设想只在调用命令手动刷新之后,squid才(在下次重新请求时)去回源,现在倒好每次都回源了。
然后在说回来我们为什么使用max-age=0,因为如果我们不使用这个设置的话,浏览器就很有可能在下次请求的时候使用本地缓存文件,而不和squid服务器之间进行通信,这样即使我调用了 PURGE 命令,浏览器依然有可能使用的是就文件。
最后说一下今天查询的关于squid的配置资料,大体上发现有配置项 ignore-no-cache 可以忽略 cache-control:no-cache ,配置项 override-expire 可以忽略 expire:xxx ,但是没有发现哪个配置项可以忽略max-age=0的这种情况。
最后说一下,为啥不采用每次更新文件都改名的方式,如果每次更新文件都改名,那么就可以将所有文件都设置一个很大的max-age值,那么就不会遇到max-age=0被强制回源的问题了。答案是之前我们用第三方的解决方案的时候,一直都是用同名文件刷新缓存的方式,当然也有更改文件路径的情况,但是那些一般用在批处理操作中,刷新同名文件一般用在js文件中。

http squid 缓存

rendan 11 years, 4 months ago

大体找到解决方案了,把 cache-control:max-age=0 改为 cache-control:no-cache ,然后在squid配置 ignore-reload ,具体配置语法参见squid官网refresh_pattern的说明文档: http://www.squid-cache.org/Doc/config/refresh_pattern/

blueden answered 11 years, 4 months ago

Your Answer