実装方法の検討

Write : 2005/12/29

HTTP_REFERER

参照元リンク機能を実装するにあたって、まず考えたのが HTTP_REFERER でした。HTTP_REFERER とは、ウェブブラウザがウェブサーバに対して送信する情報の一つで、リンク元の URL 情報です。PHP であれば $_SERVER['HTTP_REFERER'] とすることで、送信された HTTP_REFERER の値を取得することができます。

しかし、この HTTP_REFERER の URL をそのまま使用してリンクを作成すれば参照元のリンクになるかというとそう簡単な話ではありません。

HTTP_REFERER を単独で使用することの問題点

HTTP_REFERER を単独で使用した場合、一見では参照元の URL が「戻る」ボタンとして正しく表示されているように見えますが、その「戻る」ボタンを押した場合、参照元の URL が正しく表示されなくなってしまいます。

例えば A, B, C と 3つのページがあり、A → B → C とリンクをたどった場合、B の参照元は A、C の参照元は B となります。もしページ C に埋め込まれた「戻る」ボタンを押した場合、 C → B へのページ遷移が発生します。

このとき ページ B での HTTP_REFERER はページ C を示しているため、HTTP_REFERER を単純に適用したのでは B の参照元が C になってしまいます。「戻る」ボタンでページを戻ったのですから、B の参照元は A のままでなくては困ります。これ以上戻ることができなくなってしまいます。

PHP_SELF と HTTP_REFERER による参照元管理

PHP_SELF は、現在のウェブページの URL に相当します。$_SERVER['PHP_SELF'] とすることで取得できます。PHP_SELF と HTTP_REFERER を組み合わせることで、「B の参照元は A」、「C の参照元は B」という様に現在のページと参照元のページをまとめて管理することが可能となります。

現在のページと参照元のページをまとめて管理することで、例えば C → B のページ遷移が発生した場合、ページ B 上で HTTP_REFERER は C を示していますが、「C の参照元は B」という情報からこのページ遷移は参照元へ戻っていることがわかります。この戻り遷移の場合には、B の参照元を C に更新せずに、「B の参照元は A」という以前の情報をそのまま生かしてやることでさらに前ページ(ページA)への戻りリンクを保証することができます。


参照元リンク機能 技術資料
1 実装方法の検討
2 内部仕様(掲載予定)