IPv6でアクセスすると"via IPv6"って出る例のやつ作りました。
(HTMLタグ貼るだけのやつが見つからなかったので)
使い方
<span id="kibousoft-viav6"></span>
<script type="text/javascript">
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://viav6.kibousoft.co.jp/', true);
xhr.onreadystatechange = function(){
if (xhr.readyState === 4 && xhr.status === 200){
var dom = document.getElementById('kibousoft-viav6');
dom.innerHTML = xhr.responseText;
}
};
xhr.send(null);
</script>
ソースコード
汚いですが直書きです。大したことしてない。
index.php
<a href="https://github.com/kibousoft/viav6_web/" style="text-decoration: none; color: white;">
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$headers = apache_request_headers();
if ($headers['X-Forwarded-For']) {
$ip = $headers['X-Forwarded-For'];
}
if (preg_match('/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $ip)) {
echo '<div style="background: linear-gradient(#FF0000, #FF99CC); padding: 5px; border: 1px solid #333333; border-radius: 3px; font-size: 13px; width: 50px; text-align: center; font-family: sans-serif;">via IPv4</div>';
} else {
echo '<div style="background: linear-gradient(#0000FF, #99CCFF); padding: 5px; border: 1px solid #333333; border-radius: 3px; font-size: 13px; width: 50px; text-align: center; font-family: sans-serif;">via IPv6</div>';
}
?>
</a>
CORSの話
外部からXHRで取得される可能性のあるサイトでは、
Access-Control-Allow-Origin
, Access-Control-Allow-Methods
ヘッダーを返す必要があります。
.htaccessで以下を設定しました。
.htaccess
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET"
インフラの話
最初Amazon API Gatewayでやろうとしたんですが、API GatewayはIPv6対応していませんでした。
なので、OpsWorksでPHP App Serverを立てて動かしています。
OpsWorksにも以下の問題がありました。
- Application Load Balancer(IPv6対応)には対応していない
- EC2へのIPv6アドレスのアタッチには対応していない
- セキュリティグループでIPv6のTCP 80番が許可されていない
そのため、上記の設定は手動で行いました。
備考
- Happy Eyeballsの関係で、サイトにはIPv4で繋がって、XHRはIPv6で繋がるケースもあるよねとか細かい話はなしで。