我在自动缩放池上有一个 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,所以我认为这不是配置问题。
ELB 无法添加该标头,因为该标头是 HTTP 的函数,而这是一个 TCP 负载均衡器。它只知道它正在传递一些 TCP 流,仅此而已。如果您需要 ELB 添加此标头,则需要在负载均衡器处终止 HTTPS。从那里它可以根据需要通过 HTTP 或 HTTPS 与您的后端实例进行通信。
虽然我非常怀疑在负载均衡器上没有完成 SSL 终止时是否有可能让 X-Forwarded-For 工作,但我还没有找到明确的答案。但是,我使用 CloudFront 完成了一个解决方案。
由于您可以有多个分配指向一个负载均衡器,并且 AWS 为 SSL 提供证书,因此您可以在边缘站点终止 SSL。CloudFront 将添加标头并将请求(如果需要)转发到负载均衡器。从那里标头将到达您的服务器。