meta name="referrer"は、HTTPS→HTTPでもリファラを出す新しい仕様
今日は、ちょっと技術的な話を。「meta referrer」という、リンクをクリックしてページ移動するときなどにリファラをどう送るかを、ページ側で指定できるタグの実装が進んでいるのです。
グーグルはHTTPSを推奨するけれども、リファラが……
グーグルは、サイトがHTTPSかどうかを順位決定の要因とするなど、HTTPSを推奨しています。
でも、自分のサイトをHTTPSにすると、自分のサイトから非HTTPS(ふつうのHTTP)のサイトへのリンクをクリックしたときに、リファラが飛ばないんですよね。
これは、RFC 2616で、「セキュア接続のページから、非セキュア接続のページに移動するときは、リファラを送出するべきではない」と定められているからです(セクション15.1.3)。
とはいえ、Web担のようなメディアでは、「Web担のページから、うちのサイトにけっこう来る人いるんですよ」という反応も大切なので、なかなかHTTPSにしづらいところでした。
新仕様meta referrerを使えばHTTPS→HTTPでもリファラを出せる
しかし、そうした問題を解決する仕様があります。「リファラポリシー」というW3Cの仕様で定められているものです。
要は、「metaタグなどで、そのページにおけるリファラの送出をコントロールできるようにしよう」というもの。
この仕様はまだ最終版にはなっていない「草案(Working Draft)」なのですが、2014年8月時点の仕様では、metaタグで指定する場合、次のようにすると定められています。
<meta name="referrer" content="ここに設定値を指定">
設定値としては、次のものが定められています。
none ―― そのページからリファラを一切送らない
origin ―― そのページからは、リファラとしてドメイン名のみのURLを送る(例:https://example.jp/page.htmからは、リファラとして「https://example.jp/」が送られる)
none-when-downgrade ―― 現在の動作と同じ(HTTPS→HTTPではリファラを送らない、それ以外の場合は元ページの全URLをリファラとして送る)
origin-when-crossorigin ―― 同じドメイン名でHTTP/HTTPSの種類も同じURLへの移動ならば、元ページの全URLをリファラとして送る。そうでなければ、リファラとしてドメイン名のみのURLを送る
unsafe-url ―― 常に全URLをリファラとして送る
つまり、HTTPS→HTTPでもリファラが送られるようにするには、次のようにすればいいんですね。
<meta name="referrer" content="unsafe-url">
リファラとしてリンク元ページの全URLではなくドメイン名だけ送られるようにするには、次のようにします。
<meta name="referrer" content="origin">
すばらしい! これなら、リファラを気にせずにサイトをHTTPS化できますね……と思うかもしれませんが、1つ問題があります。
対応しているのはまだ一部のブラウザ
残念ながら、このmeta referrerにちゃんと対応しているブラウザは、意外と少ないのです。編集部で確認したところ、次のような状況でした(2015年4月現在)。
- 対応している
- PC
- Google Chrome(Windows版)
- Google Chrome(Mac版)
- Firefox 38(開発者版、正式版は未リリース)
- モバイル
- Chrome for Android(41.0.2272.96で確認)
- PC
- 対応していない
- PC
- Firefox 37
- IE ~11
- Spartanエンジン(次期IE、RemoteIEで検証)
- Safari
- モバイル
- Android標準ブラウザ(~4.4.4で確認)
- Android 版 Firefox
- iPhoneのSafari(~iPhone 6で確認)
- Chrome for iOS(41.0.2272.58で確認)
- PC
Web担だと、HTTPSにしてmeta referrerを指定しても、全体の半分ぐらいのユーザーさんしかそれに対応していないということになります。モバイルユーザーが多いサイトでは、もっと厳しいですね。
まぁ、この仕様はまだ策定中ですからね。ChromeとFirefoxという2つのブラウザで実装されれば、仕様の策定が進み、他のブラウザも対応するようになる……ことを期待します。
HTTPSのサイトの方は、とりあえず<meta name="referrer" content="unsafe-url">
をHTMLのテンプレートに入れておくといいのではないでしょうか。
仕様に関する、もうちょっと詳しい情報
ちなみに、この仕様の内容は、次のページで確認できます。
- Referrer Policy
http://www.w3.org/TR/referrer-policy/(W3C草案)
https://w3c.github.io/webappsec/specs/referrer-policy/(最新版の編集者草案)
この記事ではmetaタグでの指定方法を解説しましたが、仕様では、metaタグ以外にも次のような方法で指定できると定められています。
- Content Security Policy HTTPヘッダー内のreferrer値
- Content Security Policy metaタグのreferrer値
- <a>、<area>、<img>、<iframe>タグのreferrer属性(指定できる値は少し異なる)
この仕様に対しては、プライバシー保護などを理由にした反対もあるようです。とはいうものの、そもそもこの仕様が提案された背景にあるのは「HTTPS→HTTPだとリファラが飛ばないから、ページの種類によってはサイト管理者がリファラの送り方を選べるようにしたいこともあるよね」というもので、仕様の中にプライバシーに関する言及などもありますし、主導しているのはグーグルの人ですので、私は楽観的に見ています。
早く、大多数のブラウザがこれをサポートするようになりませんかね。
ソーシャルもやってます!