代理与 CDN 调试响应头

Server / Via / Age / X-Request-Id / Traceparent / CDN 私有头等用于链路追踪、缓存排查和代理调试的响应头。

#type / concept #status / evergreen #tech / ops #resource / http #protocol / http

[!info] related notes

代理与 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-IdTraceparent
标准非标准约定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-IdX-Trace-Id 等变体。
  • Traceparent 需要分布式追踪基础设施支持:单独设置没有意义,需要 Jaeger/Zipkin/OpenTelemetry 等工具配合。
  • CDN 私有头在不同厂商间不能互换CF-Cache-Status 只有 Cloudflare 会返回,不要期望其他 CDN 有相同头名。
创建于 2026/5/24 更新于 2026/5/27