要让nginx对.php请求一律绕过缓存,需在location ~ .php$块中同时配置fastcgi_cache_bypass 1和fastcgi_no_cache 1,确保不读缓存且不写缓存;仅设bypass 1会导致响应被误存,引发脏数据。

要让 Nginx 对特定文件扩展名(如 .php)自动绕过缓存,核心不是“禁止缓存该后缀”,而是确保所有匹配该后缀的请求不查缓存、也不写缓存。这需要同时配置 fastcgi_cache_bypass 和 fastcgi_no_cache,并作用于正确的 location 块中。
在 PHP 处理块中统一设置 bypass 与 no_cache
推荐在处理 PHP 的 location 块(如 location ~ \.php$)内直接配置,避免跨 location 逻辑错位:
- 匹配所有以
.php结尾的请求,无论路径或参数如何 - 只要命中该 location,就强制绕过缓存读取,且响应不进入缓存池
- 无需依赖变量判断,简洁可靠,符合动态脚本的语义
示例配置:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
<pre class="brush:php;toolbar:false;"># 所有 .php 请求一律绕过缓存
fastcgi_cache_bypass 1;
fastcgi_no_cache 1;
# 若已启用 fastcgi_cache,请保留此行(但不改变 bypass/no_cache 行为)
fastcgi_cache my_cache;
fastcgi_cache_valid 200 302 10m;}
为什么不能只靠 fastcgi_cache_bypass 1?
单独设 fastcgi_cache_bypass 1 只能阻止读缓存,但响应仍可能被写入缓存——后续其他请求(比如误配了缓存键)可能拿到这个“刚生成的 PHP 响应”作为缓存内容,造成脏数据暴露。因此必须同步设置 fastcgi_no_cache 1,从源头禁止写入。
不推荐用变量匹配 .php 扩展名
例如写成 fastcgi_cache_bypass $request_uri 或基于 $sent_http_content_type 判断,既不可靠(响应头尚未生成),也无必要。Nginx 的正则 location 本身已精准识别 .php,直接在该上下文中硬编码 1 更安全、高效、易维护。
验证是否生效
添加响应头辅助观察:
- 在 location 块中加入:
add_header X-Cache-Status $upstream_cache_status; - 访问一个 PHP 页面(如
/info.php),检查响应头中X-Cache-Status是否为BYPASS - 同时确认响应中没有
X-Cache: HIT或类似标识
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











