如何根据特定标头绕过 varnish 缓存

如何根据特定标头绕过 varnish 缓存

我从两天前就开始做这件事,但没有成功。

所以,基本上,我想绕过特定传入请求 URL 的 varnish 缓存。

我定义了这个规则:

sub vcl_recv {
     if (req.url ~ "/en/reading-books/") { return(pass); }
}

但是当我刷新页面时,它仍然被缓存,响应标头返回这些:

via: 1.1 varnish-v4
x-varnish: 2

此后台运行命令产生输出:

varnishncsa -F '%{Host}i %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"'

我这里遗漏了什么?任何指点都非常感谢。

答案1

升级到受支持的版本

在讨论调试传入 URL 的缓存之前,我想指出的是你正在运行已停产的 Varnish 版本,该版本存在已知的安全漏洞

请升级到最新版本或使用 Varnish Cache 6.0 LTS。

https://www.varnish-software.com/developers/tutorials/#installations获得各种 Linux 发行版的安装指南列表。

匹配精确 URL 或 URL 模式

您共享的 VCL 代码绕过了 的缓存/en/reading-books。您是否尝试对该 URL 进行精确匹配,或者尝试匹配一组 URL 的模式?

为了实现完全匹配,我会按如下方式调整 URL:

sub vcl_recv {
    if (req.url == "/en/reading-books/") { 
        return(pass); 
    }

}

当您匹配多个以 开头的 URL 时/en/reading-books/,我会按如下方式调整 VCL:

sub vcl_recv {
    if (req.url == "^/en/reading-books/.*$") { 
        return(pass); 
    }

}

那么 Varnish 特定的响应标头呢

您在问题中提到了以下标题:

via: 1.1 varnish-v4
x-varnish: 2

这些表明您正在使用 Varnish,但不一定表示 Varnish 从缓存中提供响应。

via头只是告知用户 Varnish 是响应链中的代理服务器这一事实。

标头的值x-varnish通常指的是处理您的请求的交易的 ID。

它实际上是Age指示从缓存中提供响应的时间长度的标题。

检查日志

varnishncsa命令可以访问 Varnish 共享内存日志,但实际上并没有显示很多有用的缓存信息。

目的varnishncsa是返回访问日志信息,类似于Apache和Nginx返回的信息。

请运行以下命令来调试缓存:

varnishlog -g request -q "ReqUrl ~ '^/en/reading-books/.*$'"

虽然varnishncsa会产生 NCSA 格式的单行响应,但varnishlog会返回完整的交易。请将输出添加到varnishlog您的问题中,我会帮助您进行调试。

相关内容