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.svg
とipv4.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.svg
、ipv6.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]
皆さんも是非活用してみてくださいね!(???)
最近のコメント