サーバ変数

HTTP_REFERER

リンクをたどってきた場合,$_SERVER['HTTP_REFERER'] を調べれば,一つ前のページのアドレスがわかります。

あなたはリンクをたどらずにこのページに来ましたね

<p>
<?php
  if (isset($_SERVER['HTTP_REFERER'])) {
    $x = htmlspecialchars($_SERVER['HTTP_REFERER']);
    echo "あなたは $x のリンクをたどって来ましたね";
  } else {
    echo "あなたはリンクをたどらずにこのページに来ましたね";
  }
?>
</p>

htmlspecialchars() を使う理由については セキュリティ上の配慮 をご覧ください。

非常に古いブラウザでは,リンクをたどらなくても,直前のページのアドレスがこの方法でわかってしまう場合がありました。「REFERER漏れ」で検索してみてください。現在はもうないはずです。

HTTP_USER_AGENT

ブラウザの銘柄です。

あなたのブラウザは CCBot/2.0 (https://commoncrawl.org/faq/) ですね

<p>
<?php
  if (isset($_SERVER['HTTP_USER_AGENT'])) {
    $x = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
    echo "あなたのブラウザは $x ですね";
  } else {
    echo "あなたのブラウザは名無しですね";
  }
?>
</p>

解説

このようなWebサーバから渡される変数には,ほかに次のものがあります。

応用1

PHP で「戻る」リンクを実現するには次のようにします。

<?php
  if (isset($_SERVER['HTTP_REFERER'])) {
    echo '<a href="', htmlspecialchars($_SERVER['HTTP_REFERER']), '">[戻る]</a>';
  }
?>

もし直接 URL をアドレス欄に打ち込んでこのページに来たなら,[戻る]は表示されません。

応用2

ブラウザによって表示するページ内容を変えてみましょう。

ブラウザの種類は $_SERVER['HTTP_USER_AGENT'] に入っています。 いくつかのブラウザでどのようなものが入るか調べ,それによって条件判断しましょう。

たとえばブラウザがInternet Explorer(MSIE)かどうか調べるには

<?php
  if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
     /* Microsoft Internet Explorer の場合 */
  } else {
     /* それ以外 */
  }
?>

とします。strstr() は文字列(string)中の文字列を探す関数です。

なお,IE11からMSIEという表記が消えました。今後IEを調べるには,少し前から使われていたTridentという文字列も調べる必要があります。条件の「または」(or)はPHPでは || と書きます(ついでに「かつ」(and)は && と書きます)。

<?php
  if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE") || strstr($_SERVER['HTTP_USER_AGENT'], "Trident")) {
     /* Microsoft Internet Explorer の場合 */
  } else {
     /* それ以外 */
  }
?>

Microsoftの新しいブラウザEdgeの場合は Edge という文字列を調べます。

携帯(ガラケー)を区別するには

<?php
  $ua = $_SERVER['HTTP_USER_AGENT'];
  if (strstr($ua, "DoCoMo")) {
     /* DoCoMo携帯の場合 */
  } elseif (strstr($ua, "SoftBank") || strstr($ua, "Vodafone") ||
            strstr($ua, "J-PHONE") || strstr($ua, "MOT-")) {
     /* SoftBank携帯の場合 */
  } elseif (strstr($ua, "KDDI") || strstr($ua, "UP.Browser")) {
     /* au携帯 */
  } elseif (strstr($ua, "WILLCOM") || strstr($ua, "DDIPOCKET")) {
     /* WILLCOM */
  } else {
     /* それ以外 */
  }
?>

のようにします。

応用3

$_SERVER['HTTPS'] というサーバ変数の値が on であれば,SSL(暗号化)プロトコルでそのページを見ていることになります。

<?php
  if (isset($_SERVER['HTTPS'])) {
    echo "このページから送信される情報は暗号化されます。";
  }
?>

応用4

SQLite を併用してブラウザの種類を数える方法は ブラウザの統計 のページに移しました。

参考

すべてのサーバ変数