POSTの中身みたいに リファラもサーバ側でしか取れないんだろうなーと思っていました
しかし 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("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")
    meta.setAttribute("content","0;url=http://var.blog.jp/archives/30277883.html")
    w.document.head.appendChild(meta)
    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 
}

これだけです
上の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;~」のコードしか動かないです

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