Amazon-Web-Services

在適用於 https 的 AWS TCP 負載均衡器後面進行 X-Forwarded

  • June 2, 2017

我在自動縮放池上有一個 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 將添加標頭並將請求(如果需要)轉發到負載均衡器。從那裡標頭將到達您的伺服器。

引用自:https://serverfault.com/questions/851218