fastcgi_ignore_headers expires 并非删除头,而是让 nginx 忽略 php 输出的 expires,从而允许 expires 或 add_header 指令生效,实现缓存控制权上收;需配合 expires 2h 或 add_header ... always 主动重写头,并通过 curl -i 验证响应头是否已被覆盖。

要巧用 fastcgi_ignore_headers 拦截并覆盖 PHP 脚本输出的 Expires 响应头,关键不是简单地“忽略”,而是配合 expires 指令或 add_header 主动重写,从而实现 Nginx 层面的缓存控制权上收。
理解 fastcgi_ignore_headers 的真实作用
该指令**不会删除或屏蔽响应头**,而是告诉 Nginx:当 FastCGI 后端(如 PHP-FPM)返回某些特定响应头(如 Expires、Cache-Control、Set-Cookie)时,Nginx 在后续处理中**不将其纳入内置缓存逻辑或自动透传行为**——尤其是不影响 expires 指令的生效。
换句话说:
- 若未设置 fastcgi_ignore_headers Expires,PHP 输出的 Expires 可能被 Nginx 默认沿用,导致你配置的 expires 1h 失效;
- 加上它后,Nginx 才会“无视” PHP 自己设的 Expires,转而信任你显式写的缓存策略。
正确配置步骤(以覆盖 PHP 的 Expires 为例)
-
在 location 或 server 块中声明忽略:
fastcgi_ignore_headers Expires;
(也可同时忽略多个:fastcgi_ignore_headers Expires Cache-Control;) -
紧接着用 expires 指令统一设定缓存有效期:
expires 2h;
此时 Nginx 将生成标准的Expires和Cache-Control: max-age=7200,完全覆盖 PHP 原始输出。 -
若需更精细控制(如仅对静态资源覆盖),可结合
add_header+always:add_header Expires "Wed, 21 Oct 2037 07:28:00 GMT" always;add_header Cache-Control "public, max-age=31536000" always;
注意加always是为了确保即使返回 304 或 4xx 也携带这些头。
常见陷阱与验证方法
PHP 脚本里若写了 header('Expires: '.gmdate('D, d M Y H:i:s', time() - 3600).' GMT');,不加 fastcgi_ignore_headers 时,Nginx 很可能直接透传这个过期头,导致 expires 配置形同虚设。
验证是否生效:
- 用 curl -I http://your-site/test.php 查看响应头;
- 确认返回的是你 Nginx 配置的 Expires 和 Cache-Control,而非 PHP 输出的旧值;
- 可临时在 PHP 中加入 error_log("PHP set Expires: " . $expire, 4); 对比日志时间戳。
进阶建议:按内容类型差异化处理
不必全局忽略所有 Expires。例如:
- 对 /api/ 接口,保留 PHP 控制(不 ignore),让业务层决定时效性;
- 对 /static/ 或图片、CSS、JS,强制 Nginx 统一缓存:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {<br>
fastcgi_ignore_headers Expires;<br>
expires 1y;<br>
add_header Cache-Control "public, immutable";<br>
}php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











