You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Varnish 5.2为何不缓存AJAX GET请求却缓存浏览器直接请求?

为什么Varnish 5.2不缓存AJAX GET请求?

嘿,我来帮你拆解这个问题!你遇到的「AJAX GET请求不被Varnish缓存,但直接浏览器访问相同URL却能缓存」的情况,大概率是AJAX请求默认携带了Varnish认为不能缓存的请求头,尤其是缓存控制类的头。

核心原因:AJAX请求的默认请求头

很多前端框架(比如jQuery)发起AJAX请求时,会自动给请求加上Cache-Control: no-cache或者Pragma: no-cache头——这是为了让浏览器不缓存AJAX响应,但Varnish的默认规则里,会跳过缓存带有这些头的请求。而直接在浏览器地址栏访问时,浏览器不会自动加这些头,所以Varnish会正常缓存。

另外,如果你的AJAX请求带了Cookie,Varnish默认也不会缓存带Cookie的请求(除非后端明确允许),这也可能是原因之一。

结合你的VCL来解决问题

你的default.vcl里目前只做了Host头的归一化,没有处理这些阻止缓存的请求头,我们可以修改VCL来适配AJAX请求:

1. 先确认AJAX请求的具体头信息

先用varnishlog工具查看AJAX请求的请求头,确认是哪些头在搞事情:

varnishlog -g request -q "ReqURL ~ '/你的AJAX接口路径'"

看输出里的ReqHeader部分,找有没有Cache-Control: no-cache、Pragma: no-cache或者Cookie这些字段。

2. 修改VCL,允许缓存AJAX请求

在vcl_recv函数里添加处理逻辑,移除阻止缓存的头,或者强制标记请求为可缓存:

vcl 4.0;
import std;
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}
sub vcl_recv {
    # 原有的Host头处理
    set req.http.Host = regsub(req.http.Host, ":[0-9]+", "");
    
    # 处理AJAX请求的缓存控制头
    # 识别AJAX请求(通常带X-Requested-With头)
    if (req.http.X-Requested-With == "XMLHttpRequest") {
        # 移除阻止缓存的头
        unset req.http.Cache-Control;
        unset req.http.Pragma;
        # 可选:强制设置缓存策略,比如允许公开缓存,缓存1小时
        set req.http.Cache-Control = "public, max-age=3600";
    }
    
    # 保留Varnish默认的其他逻辑(比如判断GET/HEAD请求等)
}

如果你的AJAX请求带了Cookie,且后端返回的内容允许缓存,还需要在vcl_backend_response里补充配置:

sub vcl_backend_response {
    # 针对AJAX请求,强制设置缓存TTL并清理不必要的Set-Cookie头
    if (bereq.http.X-Requested-With == "XMLHttpRequest") {
        set beresp.ttl = 1h;
        unset beresp.http.Set-Cookie; # 如果不需要缓存中保留Cookie的话
        set beresp.http.Cache-Control = "public, max-age=3600";
    }
}

3. 验证修改效果

修改完VCL后,重新加载配置:

varnishreload

然后再次发起AJAX请求,用varnishlog查看是否出现Hit标记——如果有,说明缓存生效了。

额外提醒

Varnish 5.2是比较老旧的版本了,虽然上面的配置能解决问题,但老版本可能存在安全漏洞和性能瓶颈,如果条件允许,建议升级到更稳定的6.x系列版本哦。

内容的提问来源于stack exchange,提问作者shahzad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:48:44