特定のサイトからのアクセスのみRefererを通知せずにアクセスしたいとき。

Refererってのはいわゆる参照元、リンク元というやつで、
例えば自分のサイトにアクセスがあったとき、
そのユーザがどこから来たかわかるようになるってやつです。
ブラウザの設定で通知しないようにも出来るので信頼性が高いわけではありませんが、
被リンク数のカウントとか、で目安として使われています。


基本的には通知してしまっても全く困らないのですが、
しかし、特定のページからアクセスするときはRefererを送りたくないなーと言うときがあります。
僕の場合は、サイトの管理者領域に作成しているアクセス解析ページからとか。
自分の見やすさを考えて、Refererをリンク形式にして表示しているんですが、
それをクリックしてアクセスすると、そのアクセス解析ページのURLが、
Refererとして相手に送信されてしまうんですね。

送信されたところでパスワードが掛かってるんでいいんですが、
最近だとリンク元として訪問者のRefererを表示するようなブログも多いことですし…
(はてなダイアリーとかね)
出来れば、アクセス解析から飛ぶときはRefererを通知せずに飛びたいなと。
管理者領域のページが公開されるってのはあんまり気持ちのいい話でもないので。
(かといって、ブラウザ全体でRefererを通知しないようにしたくはないし)



というわけで、そうしてみました。

以下、簡単なメモ。


まず、間に何か挟んでリダイレクトすればいいんじゃね?(2ちゃんねるみたいな感じで)
と思って少しやってみたんだけど、話はそんなに簡単じゃなくて、
単純に何かのプログラムを介して飛ばしただけじゃ、元のリファラが残ってしまうらしい。
(一応、確認はFirefoxでのもの。以下同じ)



思いつきで試したのはこんな仕組み。
(機能部分のみ抜き出し)

access.php(アクセス解析ページ)

リンク元(REFERER)

redirect.php(リダイレクト用ページ)

$url = $_GET['url'];
header('Location: ' . urlencode($url));



僕の期待としては、相手に送られるリファラはredirect.phpであって欲しかったんですが、
実際には、access.phpの方が送られてしまいます。
まぁ転送してるだけだから仕方がないんですけど。


では、どうするか?


こちらを参考にしてみました。

HTTPヘッダでRefreshを使用します。
header(“Refresh: 0; URL=http://www.teria.com/~koseki/memo/referrer/view.php”);
 

つまり読み込んだ後再読込して、その後リダイレクト先へ飛ばすわけですね。
(動的にmetaタグを作成しているのと同じらしい / ref. META REFRESH as a Response Header – Do You PHP はてな
これを実行すると、Opera8.0を除く主要なブラウザではリファラが空になるとのこと。
(Opera8.0の場合はredirect.phpになる)

結局やりたいことはaccess.phpが相手に漏れないようにしたいわけなので、
空にしてしてしまっても、結果は似たようなものです。



というわけで、リダイレクト用ページを下記のように書き換え。

redirect.php(リダイレクト用ページ)その2

$url = $_GET['url'];
header('Refresh: 0; URL=' . urlencode($url));

これでおk。




まぁでも

2ちゃんねるみたいに不特定多数が使用するわけではない場合は、
自分の使うブラウザ側で対応するってのが正解なんだろうね。結局の所。

Refererを完全に削除にしちゃうのはちょっとなーと思ってたけど、
この辺使えばそれも巧く解消できるっぽい。

開こうとしているサーバのルートのリファラだけでなく、
開こうとしているサイトそのもののURLをリファラとして送信できる
スクリプトを作ったので公開。

imepitaだとかはルートのリファラだとうまく見れないようなので
そういうのでお困りの方はご利用ください。
 

試してないけど。