PHP側でリファラ(参照元)を取得し、そこからドメイン名だけを抽出する方法のメモ
以前まで逆アクセスランキングの取得に使っていたツールのサービス提供終了告知があったので、逆アクセス数の集計機能を自作した。
PHPでリファラを取得する
サイト閲覧者のリファラはPHPのスーパーグローバル変数 $_SERVER[‘HTTP_REFERER’] に格納されている。( $_SERVER についてはこちらを参照)
そこから取得した値を parse_url 関数を用いてパースしてあげる。
PHP_URL_HOST パラメータを指定すればドメイン名(ホスト名)のみ抽出できます。
$referer = $_SERVER["HTTP_REFERER"];
$referer_host = parse_url($referer, PHP_URL_HOST);
リファラが取得できない(ノーリファラになる)主な原因
基本的には前項の方法で問題なくリファラが取得できますが、実際に運用しているとリファラが取得できないアクセスがそこそこ確認されます。
以下にリファラが取得できない場合の主な原因をいくつか紹介しておきます。
URLを直接入力してのアクセス
当たり前ですがサイトのURLをブラウザのアドレスバーに直接入力した場合は、参照元が存在しないためリファラは取得できません。
ブックマークやお気に入りなどからアクセスした際も同様です。
スマホアプリ内からのアクセス
最近はこれが比較的多いのですが、LINEなどのスマホアプリやメールソフト内でリンクを踏んだ場合も同様にリファラは取得できません。
ただし、Twitter、Facebookなどの一部のアプリでは、リンクをクリックした際に独自のリダイレクトページを開き、そこからリンク先のページを呼び出す形になっているため、それぞれのリダイレクトページのホスト名(t.co、l.facebook.comなど)を集計することで取得できます。
httpsサイト(SSL)からhttpサイト(非SSL)へのアクセス
SSL(暗号化)に対応しているサイトから対応していないサイトにアクセスした場合、リファラの情報が引き渡されないためSSL化していないサイト側ではリファラが取得できません。(逆の場合は問題なく取得できます。)
最近では無料のSSLサーバー証明書「Let’s Encrypt」などを利用すれば簡単にSSL化できますのでぜひ導入しておきましょう。
なお、SSL化しているサイトからSSL化していないサイトへ無理やりリファラを送りたい場合、SSL化しているサイトの方でmeta type=”referrer”を設定するという手段があります。
ただし、古いバージョンやその他一部のブラウザでは対応していないことがあるため万能ではありません。