我在自动扩展池上有一个 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 将添加标头并将请求(如果需要)转发到负载均衡器。从那里,标头将到达您的服务器。