Amazon Elastic Load Balancing のリクエストヘッダ仕様を Apache HTTP Server と比較してみる (当社調べ)
ここで "クライアント" とは リバースプロキシサーバーに直接接続しにきたヤツのことです。
Apache の mod_proxy_http をデフォルトで使った場合
Host: {オリジンサーバーのホスト}
X-Forwarded-For: {クライアントが送ってきた X-Forwarded-For リクエストヘッダ値 + クライアントのIPアドレス}
X-Forwarded-Host: {クライアントが送ってきた X-Forwarded-Host リクエストヘッダ値 + クライアントが送ってきた Host リクエストヘッダ値}
X-Forwarded-Server: {クライアントが送ってきた X-Forwarded-Server リクエストヘッダ値 + リバースプロキシサーバーのホスト名. ServerNameで指定}
Connection: Keep-Alive
ELB の場合
Host: {クライアントが送ってきた Host リクエストヘッダ値}
X-Forwarded-For: {クライアントが送ってきた X-Forwarded-For リクエストヘッダ値 + クライアントのIPアドレス}
X-Forwarded-Port: {クライアントが接続してきたリバースプロキシサーバーのポート番号}
X-Forwarded-Proto: {クライアントが使用したプロトコル. 典型的には http や https}
Connection: keep-alive
いずれも、Accept*: や User-Agent: などクライアントが送ってきたヘッダはそのまま流します。
ELB は X-Forwarded-Port や X-Forwarded-Proto をカンマ連結しません。
Apache の挙動を ELB に似せるための設定サンプル
似せるだけです。 実際には ELB は X-Forwarded-Host や X-Forwarded-Server に値を追加しません。
# SSLオフロードの場合
ProxyPass / http://{origin_server}/
ProxyPassReverse / http://{origin_server}/
ProxyPreserveHost On
<VirtualHost *:80>
RequestHeader set X-Forwarded-Port 80
RequestHeader set X-Forwarded-Proto http
</VirtualHost>
<VirtualHost *:443>
RequestHeader set X-Forwarded-Port 443
RequestHeader set X-Forwarded-Proto https
</VirtualHost>
# 必要に応じて
# ProxyPassReverseCookieDomain
# Filter & Substitute