这是缓存“绕过”而非“穿透”,本质是nginx proxy_cache_bypass未正确配置导致强制刷新仍走缓存;需同时满足启用缓存、变量命名规范(如$http_cache_control)、变量值有效三个条件,并配合proxy_no_cache防止污染缓存。

这不是缓存“穿透”,而是缓存“绕过”被误用或配置不全导致的预期外行为。客户端 Ctrl+F5 强制刷新时,浏览器会带上 Cache-Control: no-cache 请求头,但 Nginx 的 proxy_cache_bypass 并不会自动识别这个标准头——它只响应你显式定义的变量(比如 $http_x_refresh)。所以问题本质是:绕过逻辑没生效,请求仍走缓存,而用户以为“强制刷新 = 跳过缓存”,结果看到旧内容。
确保 proxy_cache_bypass 真正触发
绕过指令不是“开箱即用”,必须满足三个硬条件才起作用:
-
同一 location 中已启用缓存:必须有
proxy_cache mycache;(名称需与proxy_cache_path的keys_zone一致),光写proxy_cache_bypass会被忽略; -
变量名严格匹配 HTTP 头命名规则:前端发
X-Refresh: 1,Nginx 内部变量必须是$http_x_refresh(全小写、短横变下划线、固定前缀$http_),不能写成$http_X_Refresh或$arg_x_refresh; -
变量值符合非空且非禁用字符串:只要展开后不是空字符串、也不是
"0"或"off"(如"1"、"true"、"force"都有效)。
让 Ctrl+F5 自动触发绕过(无需改前端)
浏览器强制刷新自带 Cache-Control: no-cache,你可以直接利用它,避免要求前端加额外 header:
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 在 location 块中添加:
proxy_cache_bypass $http_cache_control; - 同时补上:
proxy_no_cache $http_cache_control;(防止绕过请求意外写入缓存) - 注意:
$http_cache_control展开后是"no-cache",满足“非空且不为 0/off”,因此会触发绕过
防止绕过请求污染缓存
只配 proxy_cache_bypass 不够,Nginx 默认仍可能把绕过后的响应存进缓存(尤其当后端返回了 Cache-Control: public)。必须加防污配置:
-
proxy_no_cache $http_cache_control;—— 对含Cache-Control: no-cache的请求,禁止写入缓存; - 或更稳妥地:
proxy_no_cache $http_x_refresh $http_cache_control;,覆盖所有绕过场景; - 验证方式:查看响应头是否含
X-Cache: MISS(或自定义日志字段),并确认缓存目录里没有对应 key 的文件。
补充:静态资源(如 index.html)建议关缓存
前端 HTML 文件更新后,用户即使强制刷新,若 Nginx 缓存了旧 HTML,仍会加载旧 JS/CSS。这类资源不适合走 proxy_cache:
- 对
location = /index.html这类路径,直接禁用缓存:proxy_cache off;; - 或统一加响应头:
add_header Cache-Control "no-cache, no-store, must-revalidate";; - 避免和 proxy_cache 共存,否则易出现策略冲突。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










