Nginx 中不存在 fastcgi_cache_revalidate 指令;真正实现 304 缓存校验需 PHP 输出 Last-Modified 或 ETag 头、Nginx 不忽略这些头、客户端携带 If-Modified-Since 或 If-None-Match 请求头。
Nginx 中根本没有 fastcgi_cache_revalidate 这个指令——它不是官方支持的配置项,也不存在于任何稳定版 Nginx 或主流模块中。这是一个长期流传的误解,常被误认为能“自动校验缓存有效性”或“触发后台刷新”,但实际并不存在。
真正能减少 PHP 后端查询负载、避免重复执行 304 校验逻辑的方式,是让 Nginx 自己判断并直接返回 304 Not Modified,完全绕过 PHP 进程。这不需要 revalidate,只需要两个关键配合:
PHP 脚本必须输出标准缓存标识头:
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $mtime) . ' GMT');// 或header('ETag: "xyz789"');
Nginx 配置中确保这些头没被忽略:
❌ 删除或注释掉类似这一行:fastcgi_ignore_headers Last-Modified ETag;
✅ 默认情况下,Nginx 会缓存并保留这些响应头。
客户端请求需携带匹配的校验头(浏览器自动带):If-Modified-Since: ... 或 If-None-Match: "xyz789"
缓存未过期(在 inactive 时间内),且命中缓存 → Nginx 直接比对时间/ETag,满足条件就返回 304,PHP 完全不参与。
fastcgi_cache_use_stale 应对后端异常当 PHP 临时不可用(超时、502、503 等),你仍希望用户看到旧内容,并维持缓存有效性判断逻辑:
fastcgi_cache_use_stale error timeout http_500 http_502 http_503 http_504 updating;
其中 updating 特别重要:
fastcgi_cache_valid,对 200 响应缓存足够长时间(如 10m 或 1h); fastcgi_cache_bypass 和 fastcgi_no_cache 排除登录态、POST、带 Cookie 的敏感请求; 不复杂但容易忽略。核心就三点:PHP 输出正确头、Nginx 不忽略它们、客户端请求带校验条件。这样,304 就由 Nginx 单独完成,PHP 连进程都不会启动。