缓存绕过时未正确透传请求给后端,本质是边缘层跳过缓存后未完整转发原始请求头、参数及上下文,导致后端收到失真请求;需通过$upstream_cache_status为bypass确认绕过行为,对比curl响应与直连后端差异,检查proxy_pass透传配置、query string重写及cdn隐式干预。

缓存绕过时未正确透传请求给后端,本质是边缘层(Nginx/CDN)在决定“不缓存”后,未能将原始请求头、参数或上下文完整转发,导致后端收到失真请求——比如丢失 Cookie、篡改 User-Agent、忽略 query string 中关键字段,甚至被强制添加或删除 header。这类问题不会触发 5xx 错误,但业务逻辑会异常(如鉴权失败、分页错乱、灰度路由失效),排查需聚焦“请求变形”而非“是否缓存”。
确认绕过行为是否真实发生
先排除“误判绕过”的可能:
- 检查 $upstream_cache_status 日志值是否为 BYPASS(不是 MISS 或 EXPIRED),BYPASS 表示 Nginx 明确执行了 proxy_pass,但跳过了缓存写入和读取逻辑
- 用 curl -v 对比边缘节点响应与直连后端的响应:重点关注 HTTP 状态码、响应体内容、Set-Cookie、X-Request-ID 是否一致;若后端返回 401 但边缘返回 200,大概率是鉴权头被丢弃
- 在 Nginx 的 proxy_pass location 块中临时加日志:log_format full '$remote_addr - $request - $http_cookie - $http_authorization - $args';,对比 access_log 中记录的原始请求字段与后端实际收到的字段
检查透传配置是否遗漏关键 header
Nginx 默认不透传部分敏感 header,需显式声明:
- proxy_pass_request_headers on;(默认已开启,但需确认未被覆盖)
- 必须显式透传的常见 header:Cookie、Authorization、X-Forwarded-For、X-Real-IP、X-User-ID
- 禁用自动清理:proxy_set_header Cookie $http_cookie;(避免 proxy_hide_header Cookie 导致丢失)
- 若后端依赖特定 UA 做设备识别,需保留:proxy_set_header User-Agent $http_user_agent;,不能留空或硬编码
验证 query string 和 body 是否被截断或重写
绕过场景下,query string 易被规则误处理,body 在非 GET 请求中可能因配置缺失而丢失:
- 检查是否有 rewrite 或 set $args 指令在 proxy_pass 前修改了 URI;尤其注意正则匹配中 $1 捕获是否遗漏了 query string
- 对 POST/PUT 请求,确认未启用 proxy_buffering off; 且未设置 client_max_body_size 过小,否则大 body 会被截断并静默失败
- 在后端入口打日志,输出 完整原始 query string 和 request body 的长度/哈希,与 Nginx access_log 中的 $args 和 $request_body(需开启 $request_body 变量支持)比对
排查 CDN 或中间代理的隐式干预
若 Nginx 前还有 CDN 或 WAF,它们可能在绕过时自行改写请求:
- 查看 CDN 回源日志中的 Origin-Request-Header 字段(如有),确认是否被注入额外 header(如 X-CDN-Region)或剥离了自定义 header
- 检查 CDN 控制台“回源请求头”配置,是否存在“自动删除未声明 header”选项被开启
- 抓包对比:从客户端发起请求 → CDN 边缘节点 → Nginx → 后端,逐层比对请求头和 body 的 SHA256 值,定位在哪一跳发生变更











