fastcgi_ignore_headers 用于让 Nginx 忽略 PHP 返回的指定响应头(如 Cache-Control、Expires、Set-Cookie),避免其干扰缓存;需配合 fastcgi_cache_valid 和 fastcgi_cache 同位置配置才生效。

fastcgi_ignore_headers 的作用,是让 Nginx 主动忽略 PHP 脚本返回的某些响应头,从而避免这些头“中断”缓存流程。PHP 程序(比如 WordPress、Laravel 或自定义脚本)常会输出 Cache-Control: no-cache、Set-Cookie 或 Expires,而 Nginx 默认会严格遵守这些头——哪怕你配了 fastcgi_cache_valid,只要响应里带了 Set-Cookie,Nginx 就直接跳过缓存,返回 X-Cache: BYPASS。
要真正“强制接管”,关键不是只加一行指令,而是组合使用:fastcgi_ignore_headers + fastcgi_cache_valid + 正确的缓存区域启用。
必须配置的三项核心
-
明确禁用干扰头
在location ~ \.php$块中加入:fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
这行告诉 Nginx:“别管 PHP 返回的这几个头,我来决定要不要缓存”。
-
必须定义哪些状态码缓多久
fastcgi_cache_valid不能只写在http或server块顶层;它必须出现在location ~ \.php$内部,且需明确列出可缓存的状态码:立即学习“PHP免费学习笔记(深入)”;
fastcgi_cache_valid 200 301 302 10m; fastcgi_cache_valid 404 1m;
如果漏掉这句,或只写了
fastcgi_cache_valid 10m;(无状态码),缓存不会生效。 -
必须启用缓存区域并匹配名称
确保该 location 块里有:fastcgi_cache my_cache; # 名字必须和 http 块中 keys_zone= 后面的一致
比如
fastcgi_cache_path /path/... keys_zone=my_cache:100m ...;
常见错误与补救
-
PHP 自动发了
Set-Cookie?session_start()、setcookie()、header('Set-Cookie: ...')都会触发。即使你加了fastcgi_ignore_headers,也要确保:- 不在首页、列表页等公开页面调用;
- 如需登录态,改用
session_write_close()提前关闭会话,或用session_cache_limiter('')禁用自动头。
-
后端返回
X-Accel-Expires: 0?
这个头会覆盖fastcgi_cache_valid。加一句:fastcgi_hide_header X-Accel-Expires;
-
缓存仍不命中?查
X-Cache响应头
加上调试头:add_header X-Cache "$upstream_cache_status";
返回值可能是:
-
MISS:缓存未建立(第一次访问或被清空); -
HIT:成功命中; -
BYPASS:被fastcgi_no_cache或条件跳过; - 空或缺失:说明
fastcgi_cache根本没启用(检查fastcgi_cache my_cache是否写错名字、是否在正确 location 内)。
-
实用建议
- 不要全局忽略
Vary头,Nginx 默认已处理Vary: Cookie,但如果你禁用了Set-Cookie缓存,就等于默认放弃按用户区分缓存——这对登录页是危险的,所以务必配合fastcgi_no_cache跳过敏感路径。 - 若 PHP 输出了
Cache-Control: private,仅fastcgi_ignore_headers不够,还需确认fastcgi_cache_valid显式覆盖了 200 状态码。 -
fastcgi_ignore_headers不影响请求头,只作用于响应头;它也不改变 PHP 行为,只是让 Nginx “选择性失明”。
不复杂但容易忽略。



















