#Elastic Beanstalk $_SERVER['REMOTE_ADDR'] 取得できない

ローカルで正しく動いたソースが AWS ELB にアップするとユーザーリモート IP アドレス取得できなくなりましたので、調べてみました。

Load Balancer $_SERVER['REMOTE_ADDR'] Not working(opens new window)

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

ここのForFormの略?かもしれません。

使える 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)

2020-11-22
  • aws
  • php

関連記事

twig 3 人気 PHP テンプレートエンジンがバージョンアップ
php curl 使って クリックなしで POST 送信
FlattenException deprecated
allowurlinclude の設定で ftp_connect()エラー
デプロイツール Capistrano
Lumen と Laravel 違い比較
Laravel5.7 の MVC 使う時のメモ
PHP 7.4 にアップグレードして使えなくなる機能
php 開発におけるルール・規約
解決!phpMyAdmin テーブル構造の内容が表示されない問題
開発時によく使うゼロ埋めパディング作業まとめ
正規表現一覧 よく使う検索・置換のパターン
AWS EC2 の amazon-linux-extras の話
知ってるようで知らなかった composer のコマンドとオプションの世界
Laravel 5.1 から 8.1 にバージョンアップ
laravel vuejs 初期設定
nuxtjs と codeigniter で jwt システム構築
HTML から PDF に変換 PHP ライブラリ mPDF の設定
php.ini 初期設定のいろいろ
爆速・軽量フレームワーク codeigniter PHP 開発
Laravel Error についてのメモ