# Elastic Beanstalk $_SERVER['REMOTE_ADDR'] 取得できない
ローカルで正しく動いたソースが AWS ELB にアップするとユーザーリモート IP アドレス取得できなくなりましたので、調べてみました。
Load Balancer $_SERVER['REMOTE_ADDR'] Not working
If you need the remote host's address from behind the ELB, get it from HTTP header "X-Forwarded-For".
X-Forwarded-For で取得できるようです。
// 本来アクセスユーザーの IP アドレス取得
$ip = $_SERVER['REMOTE_ADDR'];
// AWS ELBでアクセスユーザーの IP アドレス取得
$ip = $_SERVER['X-Forwarded-For'];
なぜ X-Forwarded-For
クライアントからのアクセスはロードバランサー経由してからサーバーへアクセスするため、$_SERVER['REMOTE_ADDR']で取得した IP アドレスはクライアントのではなく、ロードバランサーの IP アドレスになります。Elastic Load Balancing は、クライアントの IP アドレスを X-Forwarded-For リクエストヘッダーに格納してくれるので、$_SERVER['X-Forwarded-For']を使用することで正しくユーザー IP 取得できます。
Elastic Load Balancing 処理後の header 例
# ip v4
X-Forwarded-For: 203.0.113.7
# ip v6
X-Forwarded-For: 2001:DB8::21f:5bff:febf:ce22:8a2e
ここのForはFormの略?かもしれません。
使える X-Forwarded ヘッダー一覧
- X-Forwarded-For (リモート IP 取得)
- X-Forwarded-Proto (リモート接続プロトコル HTTP,HTTPS か)
- X-Forwarded-Port (リモート接続送信先ポート)
# SERVER REMOTE_ADDR 取得できないといろいろ困る不具合
正確にはローカルではロードバランサー考慮なしで ELB にアップするといろいろ不具合出ます。
頻繁にログアウトが起きる
ログインしたばかりで session 切れでログアウトされる不具合があります。
ブラウザ、IP、クッキーの情報を元にセッション ID 発行していますが、IP が変わったと判断されるともちろん session id 再発行されて、ログアウトすることになります。
# 参考
HTTP ヘッダーおよび クラシックロードバランサー (opens new window)
Elastic Load Balancing の仕組み (opens new window)
Classic Load Balancer のスティッキーセッションの設定 (opens new window)