6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHPでリバースプロキシを挟んだアクセス元のIPを取得する方法

Last updated at Posted at 2017-09-22

ちょっとハマったのでメモ

はじめに

運営しているサイトで攻撃を防ぐためにWAF製品を導入している。
問題があって、一度WAFを経由してくるためにアクセスしてきたユーザーのIPが変更されてしまってアクセス元のIPが取得できていなかった。

それまではPHPで$_SERVER['REMOTE_ADDR']としておけばIPを取得出来ていたのだが、このIPが変換されたものだと気づいたので対処することになった。

X-FORWARD-FORで取得するというのはわかったのだけど、どこのサイトを見てもhttpd.confを編集するというのが前提で説明されていた。運営しているサイトのサーバーがXserverだったので、いじれる部分に制限があったために詰まった。結果的に.htaccessに書くことで解決できた。

手順

.htaccessの最終行とかに以下を追記

// X-FORWARD-FORを使えるようにする
%{X-Forwarded-For}i

アクセス元のIPを取得したいPHPファイルで以下を書く

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
	$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
//自分の環境下では以上だと接続元と変換後のIPが取得されていたので、以下のようにexplodeを使って配列にして抜き出す処理を書く
// 取得例:"アクセス元IP, 経由後IP"

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
	$_SERVER['REMOTE_ADDR'] = explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);
}
// explodeを使ってカンマ区切りに分割
//取得例[0] => "アクセス元IP", [1] => "経由後IP"

//なのでアクセス元IPを使いたい時は、添字を入れれば取得出来る
echo $_SERVER['REMOTE_ADDR'][0]

全然いい方法ではないかと思うので、ツッコミどころあったらコメントください

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?