HTTP 标头和 Application Load Balancer - Elastic Load Balancing
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

HTTP 标头和 Application Load Balancer

HTTP 请求和 HTTP 响应使用标头字段发送有关 HTTP 消息的信息。HTTP 标头会自动添加。标头字段为冒号分隔的名称值对,各个值对之间由回车符 (CR) 和换行符 (LF) 进行分隔。RFC 2616 信息标头中定义了标准 HTTP 标头字段集。此外还有应用程序广泛使用和自动添加的非标准 HTTP 标头。某些非标准 HTTP 标头具有 X-Forwarded 前缀。Application Load Balancer 支持以下 X-Forwarded 标头。

有关 HTTP 连接的更多信息,请参阅 Elastic Load Balancing 用户指南中的请求路由

X-Forwarded-For

在您使用 HTTP 或 HTTPS 负载均衡器时,X-Forwarded-For 请求标头可帮助您识别客户端的 IP 地址。由于负载均衡器会拦截客户端和服务器之间的流量,因此您的服务器访问日志中将仅包含负载均衡器的 IP 地址。要查看客户端的 IP 地址,请使用 routing.http.xff_header_processing.mode 属性。借助此属性,您可以在应用程序负载均衡器将请求发送到目标之前修改、保留或移除 HTTP 请求中的 X-Forwarded-For 标头。此属性的可能值为 appendpreserveremove。此属性的默认值为 append

Append

默认情况下,应用程序负载均衡器会在 X-Forwarded-For 请求标头中存储客户端的 IP 地址,并将该标头传递到您的服务器。如果 X-Forwarded-For 请求标头未包含在原始请求中,则负载均衡器会创建一个以客户端 IP 地址作为请求值的标头。否则,负载均衡器会将客户端 IP 地址添加到现有标头,然后将该标头传递到您的服务器。X-Forwarded-For 请求标头可能包含多个以逗号分隔的 IP 地址。最左边的地址是首次发出请求的客户端 IP 地址。然后是某个链中的任何后续代理标识符。

X-Forwarded-For 请求标头采用以下形式:

X-Forwarded-For: client-ip-address

下面是 IP 地址为 203.0.113.7 的客户端的 X-Forwarded-For 请求标头的示例。

X-Forwarded-For: 203.0.113.7

下面是 IPv6 地址为 X-Forwarded-For 的客户端的 2001:DB8::21f:5bff:febf:ce22:8a2e 请求标头的示例。

X-Forwarded-For: 2001:DB8::21f:5bff:febf:ce22:8a2e

在负载均衡器上启用客户端端口保留属性(routing.http.xff_client_port.enabled)后,X-Forwarded-For 请求标头包括附加到 client-ip-addressclient-port-number(以冒号分隔)。然后标头采用以下形式:

IPv4 -- X-Forwarded-For: client-ip-address:client-port-number
IPv6 -- X-Forwarded-For: [client-ip-address]:client-port-number

对于 IPv6,请注意,当负载均衡器将 client-ip-address 附加到现有标头时,会将地址放在方括号内。

下面是 IPv4 地址为 12.34.56.78、端口号为 8080 的客户端的 X-Forwarded-For 请求标头示例。

X-Forwarded-For: 12.34.56.78:8080

下面是 IPv6 地址为 2001:db8:85a3:8d3:1319:8a2e:370:7348、端口号为 8080 的客户端的 X-Forwarded-For 请求标头示例。

X-Forwarded-For: [2001:db8:85a3:8d3:1319:8a2e:370:7348]:8080

Preserve

属性中的 preserve 模式会确保在将 HTTP 请求发送到目标之前不会以任何方式进行修改其中的 X-Forwarded-For 标头。

删除

属性中的 remove 模式会在将 HTTP 请求发送到目标之前移除其中的 X-Forwarded-For 标头。

注意

如果您启用了客户端端口保留属性(routing.http.xff_client_port.enabled),同时还为 routing.http.xff_header_processing.mode 属性选择了 preserveremove,则应用程序负载均衡器将覆盖客户端端口保留属性。它会将 X-Forwarded-For 标头保留不变,或者根据您选择的模式将其移除,然后再将请求发送到目标。

当您选择 appendpreserve 或者 remove 模式时目标将收到的 X-Forwarded-For 标头示例见下表。在此例中,最后一跳的 IP 地址为 127.0.0.1

请求描述

示例请求

append 模式中的 XFF preserve 模式中的 XFF remove 模式中的 XFF
发送请求时没有 XFF 标头 GET /index.html HTTP/1.1 Host: example.com X-Forwarded-For: 127.0.0.1 不存在 不存在
发送请求时包含一个 XFF 标头和一个客户端 IP 地址。 GET /index.html HTTP/1.1 Host: example.com X-Forwarded-For: 127.0.0.4 X-Forwarded-For: 127.0.0.4, 127.0.0.1 X-Forwarded-For: 127.0.0.4 不存在
发送请求时包含一个 XFF 标头和多个客户端 IP 地址。 GET /index.html HTTP/1.1 Host: example.com X-Forwarded-For: 127.0.0.4, 127.0.0.8 X-Forwarded-For: 127.0.0.4, 127.0.0.8, 127.0.0.1 X-Forwarded-For: 127.0.0.4, 127.0.0.8 不存在
New EC2 experience
使用控制台修改、保留或移除 X-Forwarded-For 标头
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

  5. 流量配置部分的数据包处理下,对于 X-Forwarded-For 标头,选择附加(默认)、保留移除

  6. 选择保存更改

Old EC2 experience
使用控制台修改、保留或移除 X-Forwarded-For 标头
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择负载均衡器

  3. 选择负载均衡器。

  4. 属性选项卡上,选择编辑

  5. 对于 X-Forwarded-For 标头,选择附加(默认值)、保留删除

  6. 选择保存更改

要修改、保留或移除X-Forwarded-For标题,请使用 Amazon CLI

使用带有routing.http.xff_header_processing.mode属性的modify-load-balancer-attributes命令。

X-Forwarded-Proto

X-Forwarded-Proto 请求标头可帮助您识别客户端与您的负载均衡器连接时所用的协议 (HTTP 或 HTTPS)。您的服务器访问日志仅包含在服务器和负载均衡器之间使用的协议;不含任何关于在客户端和负载均衡器之间使用的协议之信息。如需判断在客户端和负载均衡器之间使用的协议,使用 X-Forwarded-Proto 请求标题。Elastic Load Balancing 会在 X-Forwarded-Proto 请求标头中存储客户端和负载均衡器之间使用的协议,并将标头传递到您的服务器。

您的应用程序或网站可以使用存储在 X-Forwarded-Proto 请求标头中的协议来呈现重新定向至适用 URL 的响应。

X-Forwarded-Proto 请求标头采用以下形式:

X-Forwarded-Proto: originatingProtocol

以下示例包含以 HTTPS 请求形式源自客户端的请求的 X-Forwarded-Proto 请求标头:

X-Forwarded-Proto: https

X-Forwarded-Port

X-Forwarded-Port 请求标头可帮助您识别客户端与您的负载均衡器连接时所用的目标端口。