サーバ変数
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
ブラウザの銘柄です。
あなたのブラウザは Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com) ですね
<p>
<?php
if (isset($_SERVER['HTTP_USER_AGENT'])) {
$x = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
echo "あなたのブラウザは $x ですね";
} else {
echo "あなたのブラウザは名無しですね";
}
?>
</p>
解説
このようなWebサーバから渡される変数には,ほかに次のものがあります。
$_SERVER['HTTP_ACCEPT_LANGUAGE']…… 言語:$_SERVER['REMOTE_ADDR']…… ユーザのIPアドレス: 216.73.216.216
応用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 を併用してブラウザの種類を数える方法は ブラウザの統計 のページに移しました。