Varnish缓存特定URL路径失败问题求助
修复Varnish缓存/js/目录文件的问题
问题根源
你的VCL规则中,正则表达式^/js/.$的匹配逻辑错误:
- 这个正则仅匹配
/js/后紧跟单个字符的路径(比如/js/a),而实际请求的/js/themes.js这类包含多个字符的路径无法匹配,导致代码进入else分支,强制设置cache-control: max-age = 0和ttl = 0s,自然无法被缓存。
修复方案
修改vcl_backend_response中的正则表达式,使其匹配所有以/js/开头的路径:
sub vcl_backend_response { if (bereq.url ~ "^/js/") { unset beresp.http.set-cookie; set beresp.http.cache-control = "max-age=2592000"; set beresp.ttl = 1y; } else { set beresp.http.cache-control = "max-age=0"; set beresp.ttl = 0s; } }
额外优化点
- 去掉
max-age值前后的空格,标准的Cache-Control头格式是max-age=2592000,空格可能导致部分客户端解析异常。 - 如果需要更精确匹配
/js/下的JS文件,可以用^/js/.*\.js$,避免匹配/js/下的非JS资源。
验证修复
重新加载VCL配置后,用curl请求测试:
curl -I localhost:6081/js/themes.js
如果修复成功,响应头会显示:
cache-control: max-age=2592000- 多次请求后
Age字段会大于0,说明资源已被缓存。
内容的提问来源于stack exchange,提问作者user19102264
相关产品推荐
相关产品推荐

