如何配置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头值,在缓存判断阶段就能拿到正确的内容。
正确配置步骤
- 在http全局块中配置map规则
http { # 其他全局配置... map $upstream_http_vary $fcgi_nocache { default 0; # 不区分大小写匹配包含User-Agent的Vary头 "~*user-agent" 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
相关产品推荐
相关产品推荐

