ISP など通信事業者のウェブサイトでは、IPv6 でアクセスすると "via IPv6" と表示されるようになっていることがあります。
個人のウェブサイトであれをやる意味は全くないとは思いますが、なんとなく格好いい気がするので、私のウェブサイト <https://shijimiii.info/> でもやってみました。
レンタルサーバーの設定
shijimiii.info は、さくらのレンタルサーバを利用しています。
そもそも IPv6 でサイトにアクセスできなければ表示もなにもないので、まずは IPv6 でアクセスできるようにします。サポートに情報があります。
PHP で IPv6 を判別する
"via IPv6" の部分は画像になっていることが多い気がしますが、わざわざ画像を用意するのも面倒なのでテキストで表示することにします。
shijimiii.info のトップページは静的な HTML ファイルです。これもまた、このためだけにページを丸ごと PHP などに変えるのは大げさなので、IPv6 でアクセスしたときだけ、:after
疑似要素で H1
の後に "via IPv6" という文字列を追加する CSS を PHP を使って出力することにしました。
具体的には IPv6 の時だけ、
h1:after { content: " via IPv6" }
という CSS を出力するようにします。
PHP で IPv6 か IPv4 かを判別する方法はいくつかあるようです。
今回は環境変数 SERVER_ADDR
の出力を使って判別する方法にしました。
さくらのレンタルサーバの SERVER_ADDR
ここでハマってしまったのですが、さくらのレンタルサーバでは SERVER_ADDR
がグローバル IP アドレスではなく、内部で使用している IP アドレス (IPv4) を出力するようです。*1
さくらのレンタルサーバでは SERVER_ADDR
の代わりに HTTP_LISTEN_IPADDR
を使用すれば良さそうです。
完成
完成した PHP プログラムがこちら。
<?php header("Content-Type: text/css; charset=utf-8"); ?> @charset "utf-8"; <?php if ($_SERVER['HTTP_LISTEN_IPADDR'] == '2403:3a00:101:f:219:94:163:175') { echo "h1:after { margin-left: 0.1em; content: \" via IPv6\"; color: gray; font: italic 50% sans-serif }"; }
プログラム中の IPv6 のアドレス 2403:3a00:101:f:219:94:163:175
はサーバーの IP アドレスです。サーバーの IP アドレスはコントロールパネルで確認できます。
サーバーには IPv4 と IPv6 両方のアドレスが割り当てられており、IPv4 で接続すれば HTTP_LISTEN_IPADDR
には IPv4(のサーバーの)アドレスが、IPv6 で接続すれば IPv6 のアドレスが入るようです。そのため、この値がサーバーに割り当てられている IPv6 のアドレスと一致したときに CSS を出力すれば良い、というわけです。
出力される CSS は次の通り。
@charset "utf-8"; h1:after { margin-left: 0.1em; content: " via IPv6"; color: gray; font: italic 50% sans-serif }
IPv6 でアクセスすると次のようになります。
*1:2018 年 3 月より