JavaScriptでrefererを飛ばさないリンクを作る
管理画面でクロールした別サイトにリンクを張っているのですが、管理画面のURLを外部に公開したくないのでリファラーを隠せないかなと思いまして。
リファラーを飛ばさない方法
リンク先にリファラーを飛ばさない方法として思いつく限りだと以下のものがあるかと。
他にあったかなぁ。
サイトをHTTPSで作る
これができればいいですが、環境を作るのが面倒。
ジャンプページサービスを使う
2chとかでやっている方法。
metaタグのrefreshで移動させる
metaタグのrefleshだとリファラーが飛ばないという仕様があって、ジャンプ用のHTMLを用意した上で
jump.html?url=http%3A%2F%2Fwww.yahoo.co.jp%2F
こんな感じに動的にURLパラメーターを渡してJavaScriptでmetaタグを動的に作成すれば飛ばせそう。
dataURIスキームを使う
これもmetaタグなのですが、aタグに直接ジャンプページとなるHTMLタグを流し込むという、なんというか力技な解決策です。
古いブラウザだと対応してないけど、少なくともHTML5対応しているブラウザなら問題なく動作するはず。
HTTPSは面倒、外部サービスを使うのはちょっとやめたい、ということで残りは2つですが、やったことないという理由で今回はdataURIスキームでやろうかと。
dataURIスキームでのやり方
やってみたら簡単でした。
var url = 'http://cgi.b4iine.net/env/';
var html = '<!DOCTYPE html><title>jump</title><meta http-equiv="refresh" content="0; url=' + url + '">';
var link = 'data:text/html;charset=utf-8,' + encodeURIComponent(html);
window.open(link, '_blank');
確認君+に飛ぶので、リファラーが消えているかどうかこのリンクから確認できます。
ググるとHTML4時代のコードがよく出てくるのですが、scriptタグ内にのコメントがあったりして、もうそういう時代じゃないんじゃないかな?と思ってHTML5版で作りました。
あと、無駄にThe W3C Markup Validation Serviceでvalidにしました。titleタグが必須要素らしく、せっかくhtml, head, bodyタグを削ったのに結果的に減ってないような気もしますが、ミニマムを目指しました。
ちなみにencodeしたURIはこうなります。
"data:text/html;charset=utf-8,%3C!DOCTYPE%20html%3E%3Ctitle%3Ejump%3C%2Ftitle%3E%3Cmeta%20http-equiv%3D%22refresh%22%20content%3D%220%3B%20url%3Dhttp%3A%2F%2Fcgi.b4iine.net%2Fenv%2F%22%3E"