分层明确职责:CDN管广度,Nginx管精度;用隔离、透传与覆盖协同控制。一、按业务类型划分缓存责任:CDN缓存带哈希的静态资源并设长TTL,Nginx缓存动态内容并差异化key;敏感路径强制绕过CDN。二、用proxy_ignore_headers忽略后端错误Cache-Control,配合proxy_cache_valid显式设有效期。三、通过X-From-CDN等请求头识别来源,实现Nginx与CDN缓存分流与双向握手。四、统一ETag与Last-Modified,或采用URL版本化+immutable策略规避协商缓存失效。

核心思路是分层明确职责:CDN管广度,Nginx管精度;不强行统一策略,而是用隔离、透传与覆盖三类手段协同控制。
一、按业务类型划分缓存责任边界
避免让 CDN 和 Nginx 对同一类资源重复决策。典型分工如下:
- CDN 负责静态资源广域缓存:JS/CSS/图片/字体等带哈希或版本号的文件,由 CDN 设置长 TTL(如 max-age=31536000),Nginx 只做基础透传,不启用 proxy_cache
- Nginx 负责动态内容精准缓存:/api/、/user/、含 Cookie 或 Accept-Language 的页面,关闭 CDN 缓存(设 TTL=1s 或禁用),由 Nginx 用 proxy_cache_key 包含 $http_cookie、$http_accept_language 等变量实现差异化缓存
- 敏感路径强制绕过 CDN 缓存:在 CDN 控制台将 /login、/admin、/webhook 等路径设为“不缓存”,确保每次请求直通 Nginx,再由 Nginx 做鉴权或限流
二、用 proxy_ignore_headers 精准覆盖后端干扰头
当后端应用(如 PHP/Node)对所有响应硬塞 Cache-Control: no-cache,但你知道某类资源实际可缓存时,Nginx 层需主动干预:
- 在对应 location 块中添加:proxy_ignore_headers Cache-Control Expires; —— 这不会删除响应头,只是让 Nginx 自身忽略它们做本地缓存判断
- 配合 proxy_cache_valid 200 302 1h; 显式指定缓存有效期,覆盖后端错误指令
- 注意:该指令仅对标准头生效(Cache-Control/Expires/Set-Cookie/ETag 等),且必须写在 proxy_pass 所在 location 内
三、通过请求头识别来源,实现缓存逻辑分流
防止 CDN 回源请求被 Nginx 错误缓存,或 Nginx 缓存被 CDN 无效穿透:
- 在 CDN 配置中开启“回源携带自定义头”,例如加 X-From-CDN: true
- Nginx 中用 map 或 if 判断该头,动态跳过缓存:set $skip_cache "1" if ($http_x_from_cdn = "true");,再在 proxy_cache_bypass 中引用
- 反向也可用:Nginx 主动加 X-From-Nginx: true,CDN 根据此头决定是否启用边缘缓存,形成双向握手机制
四、ETag 与 Last-Modified 必须全局一致
多节点部署下,CDN 多个边缘节点回源可能拿到不同 ETag(因 inode/mtime 不一致),导致协商缓存失效:
- 统一关闭默认行为:etag off;
- 静态资源用构建时生成的哈希值设 ETag:add_header ETag "md5-abc123";
- Last-Modified 设为固定时间戳或 Git commit 时间:add_header Last-Modified "Wed, 01 Jan 2025 00:00:00 GMT";
- 更彻底方案:URL 版本化 + immutable 缓存策略,直接规避协商缓存需求


















