JavaScriptでもリファラは取れる!
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
POSTの中身みたいに リファラもサーバ側でしか取れないんだろうなーと思っていました
しかし JavaScriptでも見ることが出来ました!
リファラは「document.referrer」に保存されています
今のページはどこから来たかです
いじょ!
英語的には「referrer」のほうが正しいです
httpに関するリファラの場合は「referer」と説明してるところもありました
本来 「referrer」と書くべきところを間違って「referer」と書いてしまったのが広まって直すに直せないという書き込みも見かけました
Googleでもタイプミスが原因の名前なんですからすごくありえそうです
上で書いたようにJavaScriptではr2つの方です
HTMLも下の方に書いてますが<meta name="referrer" ~~ />というのがあるのでr2つです
apacheはr1つで apacheと連携するPHPやPerlもr1つです
私は勝手に クライアント側はr2つでサーバ側はr1つと覚えてます
(例外がありそうなので推奨しません)
r1つリファラとr2つリファラ派の間では派閥争いがあるとかないとか……
たまにいますよね
リファラ消したがる人
「どこから来たか知られたくない!」
とか言っていますがそんなこと誰も気にしませんよ、あなたがどこから来ようがどうでもいいですよ
リファラはアクセス解析に使われることが多いですが 誰がこのページからアクセスした みたいに個人が特定できる形で保存されていないですし 気にする人の気がしれません
IPアドレスから個人情報がー とか無理ですよ
IPなんて誰でも知れるものです
知られてどうこう気にするものじゃないです
話が逸れましたが リファラを消す方法についてです
◆リファラは基本のaタグでのリンクの他にJavaScriptのlocation.hrefの書き換えのページ遷移でも記録されます
これは about:blankを新しいタブ(ウィンドウ)で開いて そのタブのlocation.hrefを書き換えてページ遷移させルコードです
これだとリファラがabout:blankになっていいんじゃないかな
と思いましたがダメでした
about:blankを開いたページからのリファラが送られます
サンプル
about:blank以外のページだとクロスドメインがどうこうで開いたページ内のlocationなどの変数にアクセスができません
同じドメインからになるとリファラを消せてもちょっと求められているのとは違う気がするので意味がないと思います
なのでwindow.open()はabout:blankを選んでます
◆meta タグのrefreshを使ったリダイレクトだとリファラが消えるそうです
<meta http-equiv="refresh" content="0;url=http://URL">というタグを追加します
URLのところはリダイレクトしたいURLを書きます
このコードをF12とか押してコンソールに貼り付けてみましょう
面倒な人をはココをクリック
・
・
・
・
・
・
・
・
・
・
・
・
・
はい 無理でしたね
◆metaタグのrefreshはブランクページから
metaタグのrefreshとwindow.open("about:blank")と組み合わせればよさそうです
これなら問題なくできてます
テスト
◆ググると色々なところで見かける方法はもっと短かった
"data:text/html"を使ってます
そういえばそんなのもありましたねー
ネットで見かけるものだとmetaタグの部分をencodeURIComponentかけているのでもうちょっと見やすいはずです
今回のは関数を通した後のを直接書いています
見やすい利点はあるのですが htmlやheadタグを書いていてるしmetaタグをなぜかJavaScriptのdocument.writeで出すという謎なことをしてるので無駄が多いです
テスト
◆metaタグの中身がサーバ側でできそうだよね
できるそうです
http://takuya-1st.hatenablog.jp/entry/2013/05/26/222456
サーバ側だとすごく短いのでサーバが使えるならこっちですね
ブラウザですることは
これだけです
上のPHPがremovereferrer.phpというファイル名とします
◆それにしてもリファラ何送るか自由に選ばせて欲しいんですけど
http://web-tan.forum.impressrd.jp/e/2015/04/14/19750
でも○○○に入れれるのは決まった単語だけで リファラの送る・送らないを設定するくらいです
常にGoogleから来た とかJavaScriptで偽装できるようにしてほしいです
ユーザエージェント偽装もJavaScriptじゃなくてブラウザの機能なので ブラウザの機能にしかならないのでしょうか
それでもブラウザにデフォルトで実装されてるユーザエージェント偽装と違ってリファラ偽装がデフォルトではついてないんですよね
++追記++
PHPの部分ですが試してみると
ではダメでした
普通にリファラが送信されています
この方法でできると書いていたサイトは1つではなく、いくつか見つけたので最近の仕様変更なのかもしれません
逆にダメだと思っていたLocation:を使ったリダイレクトではリファラを消すことができました
Locationじゃ消えないということを書いたページもあるので PHPの というかHTTPヘッダーでリダイレクトすることでリファラ消すのは安全じゃないのかもしれません
またいつか かわるかも
動くやり方
header関数を書き換えるだけです
それと ブラウザの違いを確認していませんでした
Chromeでは
Refresh → ×(リファラ消えない)
Location → ○(リファラ消える)
Firefoxでは
Refresh → ○
Location → ○
IEでは
IEは敵なので知りませんと いいたいところですがこういうことを調べる人はIEだとどうすればいいのか どうなるのかって知りたい人が多い気もするのでがんばって調べました
Refresh→○
Location→○
metaタグはFirefoxと同じく動きませんでした
それだけでなく window.openで開いたページ内にappendChildするとエラーが出ました
そのせいでキャンセルするはずのaタグの処理が動いてしまって TOPページに飛ばされるということに
さすがIEです 何ごともなく終わらせてくれない!
appendChildはできませんがinnerHTMLでの書き換えはできるんですよね……
もう わけがわかりません
いちおうこれでも最新のIE11なのに
まとめてみると IEとFirefoxは metaタグのrefreshはソースに書かれてないと動かなくてPHPのheader関数使うとRefreshでもLocationでもリファラ消せます
Chromeだとmetaタグのrefreshは いつ書いても動きますが PHPのheader関数でRefreshを送ってもリファラ消してくれない
ということです
JavaScriptでする場合は metaタグを埋め込めるdataスキームをwindow.openしましょう
PHPでする場合はChromeのためにRefreshじゃなくLocationを使いましょう
IE 11
Firefox 39.0a2
Chrome 36~42
しかし JavaScriptでも見ることが出来ました!
リファラは「document.referrer」に保存されています
リファラってなぁに?
そんな人も居るかもしれないので解説を入れておきます今のページはどこから来たかです
いじょ!
リファラを英語で書くと?
リファラでググるとわかると思いますが 「referrer」と「referer」の2種類があります英語的には「referrer」のほうが正しいです
httpに関するリファラの場合は「referer」と説明してるところもありました
本来 「referrer」と書くべきところを間違って「referer」と書いてしまったのが広まって直すに直せないという書き込みも見かけました
Googleでもタイプミスが原因の名前なんですからすごくありえそうです
上で書いたようにJavaScriptではr2つの方です
HTMLも下の方に書いてますが<meta name="referrer" ~~ />というのがあるのでr2つです
apacheはr1つで apacheと連携するPHPやPerlもr1つです
私は勝手に クライアント側はr2つでサーバ側はr1つと覚えてます
(例外がありそうなので推奨しません)
r1つリファラとr2つリファラ派の間では派閥争いがあるとかないとか……
リファラを消すには?
せっかくなのでリファラを無効化する方法についても触れておきますたまにいますよね
リファラ消したがる人
「どこから来たか知られたくない!」
とか言っていますがそんなこと誰も気にしませんよ、あなたがどこから来ようがどうでもいいですよ
リファラはアクセス解析に使われることが多いですが 誰がこのページからアクセスした みたいに個人が特定できる形で保存されていないですし 気にする人の気がしれません
IPアドレスから個人情報がー とか無理ですよ
IPなんて誰でも知れるものです
知られてどうこう気にするものじゃないです
話が逸れましたが リファラを消す方法についてです
◆リファラは基本のaタグでのリンクの他にJavaScriptのlocation.hrefの書き換えのページ遷移でも記録されます
window.open("about:blank").location.href = "http://var.blog.jp/archives/30277883.html"
これは about:blankを新しいタブ(ウィンドウ)で開いて そのタブのlocation.hrefを書き換えてページ遷移させルコードです
これだとリファラがabout:blankになっていいんじゃないかな
と思いましたがダメでした
about:blankを開いたページからのリファラが送られます
サンプル
about:blank以外のページだとクロスドメインがどうこうで開いたページ内のlocationなどの変数にアクセスができません
同じドメインからになるとリファラを消せてもちょっと求められているのとは違う気がするので意味がないと思います
なのでwindow.open()はabout:blankを選んでます
ところで window.openがあるコードはクリックイベントなどの関数内で行わないとポップアップとなりブロックされます
◆meta タグのrefreshを使ったリダイレクトだとリファラが消えるそうです
<meta http-equiv="refresh" content="0;url=http://URL">というタグを追加します
URLのところはリダイレクトしたいURLを書きます
var meta = document.createElement("meta")
meta.setAttribute("http-equiv","refresh")
meta.setAttribute("http-equiv","refresh")
meta.setAttribute("content","0;url=http://var.blog.jp/archives/30277883.html")
document.head.appendChild(meta)
このコードをF12とか押してコンソールに貼り付けてみましょう
面倒な人をはココをクリック
・
・
・
・
・
・
・
・
・
・
・
・
・
はい 無理でしたね
◆metaタグのrefreshはブランクページから
metaタグのrefreshとwindow.open("about:blank")と組み合わせればよさそうです
atag.onclick = function(){
var w = window.open("about:blank")
var meta = document.createElement("meta")
meta.setAttribute("http-equiv","refresh")
var w = window.open("about:blank")
var meta = document.createElement("meta")
meta.setAttribute("http-equiv","refresh")
meta.setAttribute("content","0;url=http://var.blog.jp/archives/30277883.html")
w.document.head.appendChild(meta)
return false
}
return false
}
これなら問題なくできてます
テスト
◆ググると色々なところで見かける方法はもっと短かった
atag.onclick = function(){
window.open("data:text/html;charset=utf-8,%3Cmeta%20http-equiv%3D%22refresh%22%20content%3D%220%3Burl%3Dhttp%3A%2F%2Fvar.blog.jp%2Farchives%2F30277883.html%22%3E")
}
"data:text/html"を使ってます
そういえばそんなのもありましたねー
ネットで見かけるものだとmetaタグの部分をencodeURIComponentかけているのでもうちょっと見やすいはずです
今回のは関数を通した後のを直接書いています
見やすい利点はあるのですが htmlやheadタグを書いていてるしmetaタグをなぜかJavaScriptのdocument.writeで出すという謎なことをしてるので無駄が多いです
テスト
◆metaタグの中身がサーバ側でできそうだよね
できるそうです
http://takuya-1st.hatenablog.jp/entry/2013/05/26/222456
<?php
$url = $_GET['url'];
header("Refresh: 0; url={$url}");
サーバ側だとすごく短いのでサーバが使えるならこっちですね
ブラウザですることは
atag.onclick = function(){
window.open("removereferrer.php?url="+this.href)
return false
}
window.open("removereferrer.php?url="+this.href)
return false
}
これだけです
上のPHPがremovereferrer.phpというファイル名とします
◆それにしてもリファラ何送るか自由に選ばせて欲しいんですけど
http://web-tan.forum.impressrd.jp/e/2015/04/14/19750
<meta name="referrer" content="○○○">
ができるんだってでも○○○に入れれるのは決まった単語だけで リファラの送る・送らないを設定するくらいです
常にGoogleから来た とかJavaScriptで偽装できるようにしてほしいです
ユーザエージェント偽装もJavaScriptじゃなくてブラウザの機能なので ブラウザの機能にしかならないのでしょうか
それでもブラウザにデフォルトで実装されてるユーザエージェント偽装と違ってリファラ偽装がデフォルトではついてないんですよね
++追記++
PHPの部分ですが試してみると
header("Refresh: 0; url={$url}");
ではダメでした
普通にリファラが送信されています
http://192.168.179.5/redirect_header_refresh.php?url=http://var.blog.jp/archives/30277883.html
という感じですこの方法でできると書いていたサイトは1つではなく、いくつか見つけたので最近の仕様変更なのかもしれません
逆にダメだと思っていたLocation:を使ったリダイレクトではリファラを消すことができました
Locationじゃ消えないということを書いたページもあるので PHPの というかHTTPヘッダーでリダイレクトすることでリファラ消すのは安全じゃないのかもしれません
またいつか かわるかも
動くやり方
header("Location: {$url}");
header関数を書き換えるだけです
それと ブラウザの違いを確認していませんでした
Chromeでは
Refresh → ×(リファラ消えない)
Location → ○(リファラ消える)
Firefoxでは
Refresh → ○
Location → ○
また <meta http-equiv="refresh" content="0;url=http://var.blog.jp/archives/30277883.html">を後から追加しても動きません
最初から書いておかないとダメのようです
なので上の方の例だと dataスキームを使って直接HTMLにmetaタグがある「data:text/html;~」のコードしか動かないです
最初から書いておかないとダメのようです
なので上の方の例だと dataスキームを使って直接HTMLにmetaタグがある「data:text/html;~」のコードしか動かないです
IEでは
IEは敵なので知りませんと いいたいところですがこういうことを調べる人はIEだとどうすればいいのか どうなるのかって知りたい人が多い気もするのでがんばって調べました
Refresh→○
Location→○
metaタグはFirefoxと同じく動きませんでした
それだけでなく window.openで開いたページ内にappendChildするとエラーが出ました
そのせいでキャンセルするはずのaタグの処理が動いてしまって TOPページに飛ばされるということに
さすがIEです 何ごともなく終わらせてくれない!
appendChildはできませんがinnerHTMLでの書き換えはできるんですよね……
もう わけがわかりません
いちおうこれでも最新のIE11なのに
まとめてみると IEとFirefoxは metaタグのrefreshはソースに書かれてないと動かなくてPHPのheader関数使うとRefreshでもLocationでもリファラ消せます
Chromeだとmetaタグのrefreshは いつ書いても動きますが PHPのheader関数でRefreshを送ってもリファラ消してくれない
ということです
JavaScriptでする場合は metaタグを埋め込めるdataスキームをwindow.openしましょう
PHPでする場合はChromeのためにRefreshじゃなくLocationを使いましょう
IE 11
Firefox 39.0a2
Chrome 36~42