PHPでIPv6かIPv4を表示する
PHPでIPv6かIPv4を表示する
PHPで、IPv6でアクセスされているか、IPv4でアクセスされているかを表示する方法。
インターネット上で紹介されている方法を3つまとめました。
- VirtualHostで分ける
- サーバーアドレス $_SERVER['SERVER_ADDR'] で分ける
- リモートアドレス $_SERVER['REMOTE_ADDR'] で分ける
1. VirtualHostで分ける
にぽたん研究所にも紹介されている、VirtualHostでIPv6とIPv4のサーバーアドレスを分けてリクエストヘッダーに値をセットする方法です。3つの中で一番スマートな感じがします。
- httpd.conf
- <VirtualHost 192.168.AAA.BBB:80>
- RequestHeader set X-IP-Version 4
- </VirtualHost>
- <VirtualHost [2001:e41:AAAA:BBBB::1]:80> ※ [ ] を忘れずに!
- RequestHeader set X-IP-Version 6
- </VirtualHost>
2. サーバーアドレス $_SERVER['SERVER_ADDR'] で分ける
サーバーアドレスを$_SERVER['SERVER_ADDR']で取得して、IPv6のサーバーアドレスに一致すればIPv6、IPv4のサーバーアドレスに一致すればIPv4と表示します。$_SERVER['SERVER_ADDR']は2通り、もしくはそれ以上ある場合でもホワイトリストで判別できるはずなのでこれで十分ではないかと思いました。
3. リモートアドレス $_SERVER['REMOTE_ADDR'] で分ける
リモートアドレスを$_SERVER['REMOTE_ADDR']で取得して、コロンが含まれていればIPv6、ドットが含まれていればIPv4と表示します。リモートアドレスで判別するサンプルでは、正規表現でIPv6アドレスの形式に一致しているかで判別するサンプルをいくつか見ましたが、コロンかドットの条件分けで十分ではないかと思いました。
おわり
参照サイト