代理与 CDN 调试响应头
Server / Via / Age / X-Request-Id / Traceparent / CDN 私有头等用于链路追踪、缓存排查和代理调试的响应头。
#type / concept
#status / evergreen
#tech / ops
#resource / http
#protocol / http
[!info] related notes
- 所属 MOC: http-and-frontend-networking-moc
- 总览: http-response-headers
- 缓存相关: Age、Date 与新鲜度计算, CDN 边缘缓存
- 关联概念: API 认证与安全
代理与 CDN 调试响应头
一句话定义
代理与 CDN 调试响应头帮助你回答:这个响应经过了谁?缓存命中了吗?请求 ID 是什么?如何把一次请求从前端到后端串起来?
Server
服务器软件信息。
Server: nginx
Server: Apache
Server: cloudflare
安全建议
不要暴露过多版本信息:
# 不推荐
Server: nginx/1.18.0
# 推荐
Server: nginx
甚至可以由网关层完全隐藏 Server 头。暴露版本信息可能帮助攻击者定位已知漏洞。
Date
响应生成时间。
Date: Sun, 24 May 2026 10:00:00 GMT
很多服务器自动添加。缓存计算新鲜度时也会参考它。如果 Date 和本地时钟偏差过大,可能影响缓存新鲜度判断。详见 → Age、Date 与新鲜度计算
Via
表示响应经过了代理。
Via: 1.1 proxy.example.com
Via: 1.1 proxy-a, 1.1 proxy-b
多级代理时会有多条 Via。常用于代理链路排查:响应到底经过了哪些节点。
Age
表示响应在缓存中已经存在多久。
Age: 3600
每经过一个缓存节点(CDN、代理),Age 值会累加。如果你看到:
Cache-Control: max-age=7200
Age: 3600
说明缓存响应还剩大约 3600 秒新鲜期。详见 → Age、Date 与新鲜度计算
X-Request-Id
链路追踪的核心头。
X-Request-Id: 8f7c2a1b9
用途
前端报错 → 带上 request id
后端日志 → 按 request id 搜索
网关、服务、数据库调用 → 串起来
推荐实践
- 后端生成 UUID 或短 ID,放到响应头中
- 前端报错时把 request id 一起上报
- 网关(nginx、Kong、API Gateway)通常支持自动生成和透传
- 日志系统中按 request id 做关联查询
生产环境非常建议有
没有 request id,排查线上问题时只能靠时间戳和 IP 猜测。有了它,一次用户请求从头到尾的链路都能串起来。
Traceparent
W3C Trace Context 标准的一部分,用于分布式追踪。
Traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00
格式:version-traceId-spanId-flags
| 部分 | 含义 |
|---|---|
00 | 版本 |
4bf92f35... | Trace ID(全局唯一) |
00f067aa... | Span ID(当前操作) |
00 | 采样标志 |
与 X-Request-Id 的区别
| 方面 | X-Request-Id | Traceparent |
|---|---|---|
| 标准 | 非标准约定 | W3C 标准 |
| 格式 | 自由格式 | 固定格式 |
| 追踪粒度 | 请求级别 | 跨服务 span 级别 |
| 工具支持 | 通用 | Jaeger、Zipkin、OpenTelemetry |
两者可以同时存在,互不冲突。
CDN 私有头
不同 CDN 厂商有不同的调试头,不是标准 HTTP 语义,但排查 CDN 命中非常有用。
Cloudflare
CF-Cache-Status: HIT # 缓存命中
CF-Cache-Status: MISS # 缓存未命中
CF-Cache-Status: DYNAMIC # 不缓存(动态内容)
CF-Ray: 8a1b2c3d4e5f-LAX # 请求 ID(含 POP 节点)
通用
X-Cache: HIT # 缓存命中
X-Cache: MISS # 缓存未命中
X-Served-By: cache-lax123 # 服务节点
X-Cache-Hits: 3 # 命中次数
AWS CloudFront
X-Cache: Hit from cloudfront
X-Amz-Cf-Pop: LAX50-C1
X-Amz-Cf-Id: abc123...
Akamai
X-Cache: TCP_HIT
X-Akamai-Session-Info: ...
如何串起一次请求的完整链路
前端报错
→ 从响应头拿到 X-Request-Id: abc123
→ 从响应头拿到 Traceparent: 00-traceId-spanId-00
后端日志
→ grep "abc123" → 找到所有相关日志
→ grep "traceId" → 找到跨服务调用链
CDN 日志
→ grep "abc123" 或 CF-Ray
→ 确认是否命中缓存、从哪个 POP 返回
网关日志
→ grep "abc123"
→ 确认请求到达时间、转发目标、响应时间
边界与易混淆点
- Server 头安全风险:暴露版本信息可能帮助攻击者。生产环境建议简化或隐藏。
- Age 是缓存节点添加的,不是源站:看到 Age > 0 说明经过了缓存层。
- X-Request-Id 不是标准头:是广泛使用的约定。有些系统用
X-Correlation-Id、X-Trace-Id等变体。 - Traceparent 需要分布式追踪基础设施支持:单独设置没有意义,需要 Jaeger/Zipkin/OpenTelemetry 等工具配合。
- CDN 私有头在不同厂商间不能互换:
CF-Cache-Status只有 Cloudflare 会返回,不要期望其他 CDN 有相同头名。