サーバ変数
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サーバから渡される変数には,ほかに次のものがあります。
$_SERVER['HTTP_ACCEPT_LANGUAGE']
…… 言語: en-US,en;q=0.5$_SERVER['REMOTE_ADDR']
…… ユーザのIPアドレス: 3.238.82.77
応用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 を併用してブラウザの種類を数える方法は ブラウザの統計 のページに移しました。