使用Ctrl + F5清除varnish缓存

来源:互联网 发布:java sql解析器 开源 编辑:程序博客网 时间:2024/06/05 20:48

这在我们的生产环境中,是相当有用的。编辑上传图片后,直接按Ctrl + F5强制刷新web页面,即可刷新web页面包括其它资源。

具体的原理是当用户使用ctrl + F5强制刷新浏览器时,浏览器会添加如下请求头信息:

Pragma    no-cache
Cache-Control    no-cache

这两行header, 那么只要在varnish中捕获这些header, 就可以ctrl + F5清除缓存了,配置非常简单

在default.vcl 的 sub vcl_hit事件中增加以下代码:


    if ( req.http.Pragma ~ "no-cache" ) {
        set obj.ttl = 0s ;
        return (pass);
    }


常用的代码如下:

sub vcl_hit {
   
     if (!obj.cacheable) {
         return (pass);
     }

    if ( req.http.Pragma ~ "no-cache" ) {
        set obj.ttl = 0s ;
        return (pass);
    }
    return (deliver);
}

这段代码告诉varnish, 当请求header Pragma中包含no-cache时,清理缓存(obj.ttl=0s),并直接从后端服务器取得数据( 即return (pass) );

但是这样一来,任何人使用Ctrl + F5即可清除缓存,这样存在一定问题,可以考虑使用限制IP来源,只允许部分IP通过这种方式来清楚缓存。如以下代码:

acl   local {

      "192.168.11.68";

      "1.2.3.4";

}

sub vcl_hit {

      if (!obj.cacheable) {
         return (pass);
     }

     if (client.ip ~ local && req.http.Pragma ~ "no-cache") {

         set obj.ttl = 0s;

         return (pass);

     }

      return (deliver);
}
另外,也可以使用Cookie传递密码方式验证,只有Cookie中传递的密码正确,才清除缓存。

 

准备工作:给firefox安装 Modify Header插件,设置Cookie, 比如设置Cookie : pwd=123456, 则varnish的配置:

 

 if ( req.http.Cookie ~ "pwd=123456" && req.http.Pragma ~ "no-cache" ) {
        set obj.ttl = 0s ;
        return (pass);
  }

 

借助VCL强制的控制结构,可以做任何逻辑验证。

原创粉丝点击