在 AWS TCP 负载均衡器后面获取 https 的 X-Forwarded

在 AWS TCP 负载均衡器后面获取 https 的 X-Forwarded

我在自动扩展池上有一个 AWS TCP 负载均衡器,它后面有多个域,所以我无法在负载均衡器上执行 SSL 终止,因此无法使用 TCP。

我已经更新了我的日志记录格式以记录 X-Forwarded-For,这对于 HTTP 很有效,但不适用于 HTTPS。

论坛没有指出这无法完成,因为它讨论了 HTTP(S),但我无法让它工作。它可以工作吗?

这是我的日志详细信息:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
LogFormat "%h %l %u %t \"%r\" %>s %b" common

CustomLog "logs/access_log" combined env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded

在 PHP 中转储所有属性,我可以看到 HTTP 请求的标头,但看不到 HTTPS,所以我不认为这是一个配置问题。

答案1

ELB 无法添加该标头,因为该标头是 HTTP 的功能,而这是一个 TCP 负载均衡器。它只知道它正在传递一些 TCP 流,仅此而已。如果您需要 ELB 添加此标头,则需要在负载均衡器上终止 HTTPS。从那里,它可以根据需要通过 HTTP 或 HTTPS 与您的后端实例进行通信。

答案2

虽然我非常怀疑当负载均衡器上未完成 SSL 终止时,X-Forwarded-For 是否能够正常工作,但我还没有找到明确的答案。不过,我使用 CloudFront 找到了一个解决方案。

由于您可以有多个分发指向一个负载均衡器,并且 AWS 为 SSL 提供证书,因此您可以在边缘位置终止 SSL。CloudFront 将添加标头并将请求(如果需要)转发到负载均衡器。从那里,标头将到达您的服务器。

相关内容