プリンとコーヒー

ぼちぼち投稿を再開したいと思っています

"via IPv6" を表示する

ISP など通信事業者のウェブサイトでは、IPv6 でアクセスすると "via IPv6" と表示されるようになっていることがあります。

個人のウェブサイトであれをやる意味は全くないとは思いますが、なんとなく格好いい気がするので、私のウェブサイト <https://shijimiii.info/> でもやってみました。

レンタルサーバーの設定

shijimiii.info は、さくらのレンタルサーバを利用しています。

そもそも IPv6 でサイトにアクセスできなければ表示もなにもないので、まずは IPv6 でアクセスできるようにします。サポートに情報があります。

PHPIPv6 を判別する

"via IPv6" の部分は画像になっていることが多い気がしますが、わざわざ画像を用意するのも面倒なのでテキストで表示することにします。

shijimiii.info のトップページは静的な HTML ファイルです。これもまた、このためだけにページを丸ごと PHP などに変えるのは大げさなので、IPv6 でアクセスしたときだけ、:after 疑似要素で H1 の後に "via IPv6" という文字列を追加する CSSPHP を使って出力することにしました。

具体的には IPv6 の時だけ、

h1:after { content: " via IPv6" }

という CSS を出力するようにします。

PHPIPv6IPv4 かを判別する方法はいくつかあるようです。

今回は環境変数 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 アドレスはコントロールパネルで確認できます。

サーバーには IPv4IPv6 両方のアドレスが割り当てられており、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 でアクセスすると次のようになります。

f:id:shijimiii:20180709234103p:plain

*1:2018 年 3 月より

© shijimiii. 2012–2018