fastcgi_hide_header 不能直接构建缓存头白名单,仅用于隐藏后端危险头(如cache-control、set-cookie等),需配合add_header ... always主动注入可信缓存头,并按url/用户状态分级策略实现完整白名单机制。

fastcgi_hide_header 本身不能直接用于构建缓存头白名单,它只负责“隐藏”后端(PHP-FPM)返回的特定响应头,不参与“允许哪些头通过”的白名单逻辑。但它是实现安全、可控的边缘缓存响应头输出的关键前置动作——尤其在 PHP 动态页面场景下,必须先清除不可信或冲突的后端头,再由 Nginx 主动注入可信缓存策略。
真正构成“缓存头白名单机制”的,是 fastcgi_hide_header + add_header ... always 的组合使用,配合严格的内容分类策略。下面分三步讲清怎么做:
明确要隐藏的危险头:防止后端污染缓存控制
PHP 应用(如 WordPress、ThinkPHP)常在代码里硬写以下响应头,它们会干扰 Nginx 缓存行为,甚至导致敏感内容被 CDN 或浏览器错误缓存:
-
Cache-Control: no-cache, private, must-revalidate -
Expires: Thu, 19 Nov 1981 08:52:00 GMT(PHP session 默认) -
Set-Cookie(即使没登录,某些插件也会发) -
Vary: Cookie, Authorization(若未精准控制,会炸裂缓存粒度)
这些头一旦发出,就可能让 CDN 拒绝缓存,或让浏览器强制重验证。而 fastcgi_hide_header 是唯一能从 FastCGI 响应中彻底剥离它们的指令:
fastcgi_hide_header Cache-Control; fastcgi_hide_header Expires; fastcgi_hide_header Set-Cookie; fastcgi_hide_header Vary;
⚠️ 注意:fastcgi_hide_header 只在 location ~ \.php$ 或其父块中生效,且必须放在 fastcgi_pass 之前;它对 proxy_pass 无效(那要用 proxy_hide_header)。
用 add_header ... always 主动注入可信缓存头
隐藏完不可信头后,Nginx 需主动、确定地输出你认可的缓存策略。此时必须加 always 参数,否则:
-
add_header Cache-Control ...在 4xx/5xx 响应中不生效 - 更重要的是,不加
always时,Nginx 不会压制已被fastcgi_hide_header移除的同名头残留逻辑(旧版 Nginx 尤其明显)
正确写法:
add_header Cache-Control "public, max-age=1800, stale-while-revalidate=300" always; add_header X-Cache-By "nginx-fastcgi" always;
这样,无论 PHP 返回什么,最终客户端和 CDN 看到的 Cache-Control 只有这一条,干净、可审计、符合边缘缓存预期。
按内容类型分级设置白名单策略
不是所有 PHP 页面都适用同一套缓存头。应结合 URL 特征、用户状态、请求方法做精细化控制:
公开文章页
/post/xxx、/archives/
→ 允许public缓存,设max-age=3600,加stale-if-error搜索页
/s?keyword=xxx、带 utm 参数的分享页
→private, max-age=600,避免 CDN 缓存个性化结果POST 提交、登录接口、评论提交路径
→ 强制no-store,且跳过fastcgi_cache(用fastcgi_cache_bypass 1)含用户态的 AJAX 接口(如
/api/user/profile)
→ 不仅隐藏Set-Cookie,还要add_header Vary "X-User-ID"(需 PHP 注入该 header),确保不同用户缓存隔离
这些策略不靠“白名单配置项”,而是靠 location 匹配 + map 变量 + if 判断组合落地。例如:
map $request_uri $cache_policy {
~^/post/ "public";
~^/s\? "private";
default "no-store";
}
server {
location ~ \.php$ {
fastcgi_hide_header Set-Cookie;
fastcgi_hide_header Cache-Control;
add_header Cache-Control $cache_policy always;
# 后续根据 $cache_policy 决定是否启用 fastcgi_cache
}
}php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











