メニュー 閉じる

Connected via IPv6ロゴを追加しました

こんにちは。tukapiyoです。

お気づきの方もいらっしゃるかも知れませんが、当ブログではConnected via IPv6(IPv4)ロゴをヘッダーに表示する様になりました。
こんなやつです▼

IPv4からのアクセスであれば▼

IPv6からのアクセスであれば▼

のように表示されていることでしょう。

これが表示されることで特に意味はなく、ただの自己満足です…
ちなみに当ブログのIPv6対応はかなり前からなので、IPv6に対応したからロゴを表示した、というわけでもありません…

この記事では、これのApacheにおける実装方法について紹介したいと思います。
Apacheは2.4を使用しています。

IPv4かIPv6か

接続元がIPv4なのかIPv6なのか識別する方法は、いくつかのパターンがあります。

  • CGIやPHP等で動的に取得する方法
  • Apache側でVirtual Serverを分ける方法
  • 環境変数で取得する方法

上記は一例ですが、どのパターンであってもコンテンツ(HTML、JavaScript等)だけでの実装はできないようです。

さて当ブログでは、3点目の環境変数で取得する方法を使って実装しました。
動的コンテンツはセキュリティ上の問題となる可能性があるため見送り、Virtual Serverを分けるのは面倒なので見送りました。
環境変数で取得する方法は、なるべくコンテンツ寄りの部分で完結させられるメリットがあります。

環境変数で識別する

具体的にどのように実装するかというと、今回、.htaccess(に限らずApacheのconf直書きでも良いですが趣旨に反します)で、Server_Addr変数をチェックする方法をとることにしました。
Server_Addr変数は、Apacheがアクセスを受け付けたIPアドレスが記録される変数です。
このIPアドレスが、ApacheのIPv6のListenアドレスであれば、IPv6でアクセスがあったと判断できるわけですね。

以下の様に.htaccessに記載することで、IPv6でアクセスがあった場合にViaIPv6という変数をOnにします。
ViaIPv6という変数をわざわざ作っているのは、見やすさの観点と複数のListenアドレスに対応出来るというメリットのためです。

SetEnvIf Server_Addr "2001:19f0:7002:f75:5400:2ff:fe92:1a3a" ViaIPv6=On
2001:19f0:7002:f75:5400:2ff:fe92:1a3a は、2020年3月現在の当ブログのIPv6アドレスです。

表示する画像を変える

IPv6からのアクセスの場合はIPv6のロゴを、そうでなければIPv4のロゴを表示する必要があります。
この方法として、mod_rewriteによるURLの書き換え(リダイレクト)の方法をとることにしました。

簡単に説明すると、ip.svgという画像へリクエストが来ると、IPv6からのアクセスならipv6.svgへリダイレクト、それ以外ならipv4.svgへリダイレクトするという実装です。
実際に作成する画像は、ipv6.svgipv4.svgの2つだけです(ip.svgは実際にはリダイレクトされるので表示される事はありません)。

リダイレクトの設定は以下の様にしました。
空白行は見やすさのために入れているだけで、特に意味はなしません。

RewriteEngine On
RewriteBase /

RewriteRule ^ipv4\.svg$ - [END]
RewriteRule ^ipv6\.svg$ - [END]

RewriteCond %{REQUEST_URI} !^/ip\.svg$
RewriteRule ^(.*)$ wordpress/$1 [R,L]

RewriteCond %{ENV:ViaIPv6} ^On$
RewriteRule ^ip\.svg$ ipv6.svg [R,L]

RewriteRule ^ip\.svg$ ipv4.svg [R,L]

まずこの.htaccessの前提条件として、

  • 当ブログでは/へのアクセスを/wordpress/へリダイレクトする
  • これを迂回してip.svgのリダイレクトを設定する(ドキュメントルートにipv4.svg/ipv6.svgファイルを設置する条件)

を満たす形で作成しています。

簡単に説明すると、

4-5行目ではipv4.svgipv6.svgへのアクセスは一切リダイレクトさせないことを指示しています。

7-8行目ではip.svgへのアクセス以外は/wordpress/へリダイレクトさせることを指示しています。

10-11行目ではViaIPv6変数がOnの場合にip.svgへのアクセスをipv6.svgへリダイレクトさせることを指示しています。

13行目ではip.svgへのアクセスをipv4.svgへリダイレクトさせることを指示しています。
特に条件(RewriteCond)が指定されていませんが、これまでの中でリダイレクト対象にならなかった=IPv6のアクセスでない、ことが条件となります。

最終的に

このような.htaccessを用意すれば、IPv4/IPv6によって表示する画像を変えることができるようになります。

SetEnvIf Server_Addr "2001:19f0:7002:f75:5400:2ff:fe92:1a3a" ViaIPv6=On

RewriteEngine On
RewriteBase /

RewriteRule ^ipv4\.svg$ - [END]
RewriteRule ^ipv6\.svg$ - [END]
RewriteCond %{REQUEST_URI} !^/ip\.svg$
RewriteRule ^(.*)$ wordpress/$1 [R,L]
RewriteCond %{ENV:ViaIPv6} ^On$
RewriteRule ^ip\.svg$ ipv6.svg [R,L]
RewriteRule ^ip\.svg$ ipv4.svg [R,L]

皆さんも是非活用してみてくださいね!(???)

コメントを残す