Forwarded 是什么
Forwarded 是 RFC 7239 定义的标准转发字段,用来记录请求在链路上经过的信息:for 是客户端地址,by 是上游代理,proto 是原始协议,host 是原始主机名。它的目标是替代 X-Forwarded-For 等一系列各自为政的私有头。现实情况是私有头的普及度远高于这个标准字段,因此新系统自建链路时建议直接采用标准写法,减少解析歧义。
基本信息
| 名称 | Forwarded |
|---|---|
| 作用 | 标准化记录客户端与链路信息 |
| 规范 | RFC 7239 |
| 参数 | for 客户端、by 代理、proto 协议、host 原始主机 |
| 多跳写法 | 以逗号分隔逐跳追加 |
| 隐私处理 | 可用别名或模糊标识替代真实地址 |
多跳示例与获取
多跳示例与获取
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.60, for=198.51.100.17;proto=https;host=www.example.com
# 多跳时以逗号分隔,每一跳把自己与上游信息追加进去
# Nginx 侧可用 proxy_set_header 追加,但必须先清理客户端传入的值标准字段与私有头对照
| 标准写法 | 常见私有头 | 说明 |
|---|---|---|
| for | X-Forwarded-For | 客户端地址,可能有多个 |
| proto | X-Forwarded-Proto | 原始协议,判断是否 HTTPS |
| host | X-Forwarded-Host | 原始主机名 |
| by | X-Forwarded-Server | 处理请求的代理标识 |
典型使用场景
- 应用取真实客户端地址:在可信代理之后解析该字段用于风控与审计
- 强制跳转与 Cookie 属性判断:依据原始协议决定是否加安全标记
- 多级链路排障:按顺序还原请求实际经过的节点
- 网关规范统一:新建链路时统一采用标准字段,减少解析分歧
- 安全审计:确认哪些来源可信,避免伪造地址绕过访问控制
这类字段是客户端可以自带的,只有在请求确实经过你信任的代理、且该代理覆盖了传入值时才可信。直接读取链路上的第一个地址用于黑名单或限流,等于把判定权交给调用方,伪造一个地址就能绕过限制。