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

如何配置Nginx FastCGI缓存,当上游MediaWiki返回的响应头Vary包含User-Agent时不缓存该响应?

如何配置Nginx FastCGI缓存,当上游MediaWiki返回的响应头Vary包含User-Agent时不缓存该响应?

嘿,我之前也碰到过类似的问题,你踩的坑其实是Nginx变量的时机问题——你用的$sent_http_vary不对,得换成上游响应头的变量才行!

问题根源

$sent_http_vary是Nginx准备发送给客户端的响应头变量,它是在请求处理的后期阶段才会被赋值的。而fastcgi_no_cache是在决定是否缓存响应的早期阶段执行的,这时候$sent_http_vary还没拿到上游返回的Vary头内容,所以你的map规则永远匹配不到,结果一直是0。

正确的做法是用$upstream_http_vary,这个变量直接存储上游(也就是MediaWiki PHP)返回的原始Vary头值,在缓存判断阶段就能拿到正确的内容。

正确配置步骤

  1. 在http全局块中配置map规则
http {
    # 其他全局配置...

    map $upstream_http_vary $fcgi_nocache {
        default 0;
        # 不区分大小写匹配包含User-Agent的Vary头
        "~*user-agent" 1;
    }
}
  1. 在处理PHP的location块中应用规则
location ~ \.php$ {
    # 你的FastCGI基础配置(比如fastcgi_pass、fastcgi_param等)...

    # 调试用:可以在响应头里看到是否触发了不缓存规则
    add_header X-Fcgi-Nocache $fcgi_nocache;

    # 核心规则:当$fcgi_nocache为1时,不缓存该响应
    fastcgi_no_cache $fcgi_nocache;

    # 可选:如果需要在某些场景下跳过缓存直接请求上游,可以加上这条
    # fastcgi_cache_bypass $fcgi_nocache;

    # 你的FastCGI缓存配置(比如fastcgi_cache、fastcgi_cache_key等)...
}

验证方法

用curl请求一个带有Vary: User-Agent的页面,看看响应头里的X-Fcgi-Nocache是否为1:

curl -I https://your-wiki-domain.com/some-page.php

如果返回X-Fcgi-Nocache: 1,说明规则生效了;同时你可以查看Nginx的缓存日志(如果开启了的话),确认该请求没有被存入缓存。

额外说明

  • 这个规则会匹配所有Vary头中包含User-Agent的响应(不管是单独的Vary: User-Agent,还是和其他字段一起的Vary: Accept-Encoding, User-Agent),完全符合你的需求。
  • 对于那些Vary头不包含User-Agent的响应,Nginx依然会正常缓存,不会影响你原本的缓存策略。

备注:内容来源于stack exchange,提问作者TaylanKammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 09:29:37