Varnish未缓存响应求助:已配置Cache-Control等响应头
我来帮你一步步排查Varnish没缓存这个请求的问题——哪怕你已经设置了Cache-Control,还有不少容易忽略的细节会导致Varnish跳过缓存:
检查请求头中的Cookie/Authorization字段
Varnish默认会跳过携带Cookie或Authorization的请求(除非你自定义了VCL规则)。你可以用varnishlog命令实时查看这个请求的头信息:varnishlog -g request -q "ReqUrl ~ '/configurator/init/getPrices'"如果发现有不必要的Cookie,要么在后端服务中移除这些无关Cookie,要么在VCL里添加规则允许缓存(比如判断特定Cookie不影响缓存逻辑时,强制跳过Cookie检查)。
验证响应头的正确性
虽然你提到设置了1年有效期的Cache-Control,但要确保格式完全合规:比如应该是Cache-Control: public, max-age=31536000(注意如果是private,Varnish默认不会缓存)。你可以用curl直接获取响应头确认:curl -I "https://telesales.dev.dynacommerce.io/configurator/init/getPrices?website_id=2&type=ACQ&packageType=mobile&products=&sales_id="另外,你提到加了Pragma头,要确认它不是
Pragma: no-cache——虽然HTTP/1.1里这个头会被Cache-Control覆盖,但有些老的VCL规则可能会优先处理它,导致缓存失效。检查VCL配置中的自定义规则
先查看你的VCL配置,确认有没有规则强制跳过这个路径的缓存:- 在
vcl_recv阶段,有没有类似if (req.url ~ "/configurator/init/getPrices") { return (pass); }的代码,pass会直接绕过缓存; - 在
vcl_backend_response阶段,有没有设置beresp.ttl = 0s;或者set beresp.http.Cache-Control = "no-cache";这类强制不缓存的规则。
- 在
排查查询参数的影响
你的请求里有sales_id=这样的空值参数,Varnish默认会把不同查询参数的请求当作独立的缓存条目,但空参数可能会触发后端的特殊逻辑,导致返回的响应头隐含不缓存的指令(比如Vary头包含了这个参数,但后端处理空值时行为异常)。你可以尝试去掉空的sales_id参数,测试是否能被缓存,来验证这个可能性。通过Varnish日志和状态指标定位
- 用
varnishstat查看缓存命中率相关指标,比如cache_hit和cache_miss的数值,确认这个请求是不是持续命中miss; - 用
varnishlog查看完整的请求处理流程,重点关注VCL_call RECV、VCL_call BACKEND_RESPONSE这两个阶段的输出,看有没有返回pass/pipe,或者修改了beresp.ttl的操作——这些都会直接导致缓存不生效。
- 用
先从varnishlog和curl -I这两个工具入手,确认请求和响应头的真实情况,再对应检查VCL规则,大部分缓存失效的问题都能快速定位到。
内容的提问来源于stack exchange,提问作者Dirkos

