学習目的
運用を行う中で、IPアドレスを調べてアクセス拒否を行ったり、アクセス状況を記録する場面があります。
そのような場合に活用するのがスーパーグローバル変数 $_SERVER です。
$_SERVERスーパーグローバル変数の活用
(REMOTE_ADDR,HTTP_USER_AGENT,REQUEST_URI,HTTP_REFERERなど)- ファイル書き込み (
fopen,fwrite,fclose) - 日時の取得 (
date()関数) - 簡易ログ分析(アクセス回数・ユーザー情報の記録)
- 特定のIPアドレスを拒否する処理を実装する
フォルダとファイル名
php-accesslog フォルダを作成します。ファイル構成は以下になります。
php-accesslog/ ├── index.php # テストページ ├── deny_ip.php # IP拒否処理 ├── accesslog.php # アクセスログ記録 └── access.log # ログファイル(自動生成)
アクセスログを取ってみよう(accesslog.php)
<?php
// アクセス情報を取得
$ip = $_SERVER['REMOTE_ADDR'] ?? '不明';
$agent = $_SERVER['HTTP_USER_AGENT'] ?? '不明';
$page = $_SERVER['REQUEST_URI'] ?? '';
$time = date('Y-m-d H:i:s');
// ログファイルのパス
$logfile = __DIR__ . '/access.log';
// 書き込みデータを作成(タブ区切り)
$log = "{$time}\t{$ip}\t{$page}\t{$agent}\n";
// ファイルを開いて追記モードで書き込む
$fp = fopen($logfile, 'a');
if ($fp) {
fwrite($fp, $log);
fclose($fp);
}
?>
$_SERVERとは?
$_SERVER は、サーバーやクライアント(ブラウザ)から送られてきた情報を保持するスーパーグローバル変数です。PHPが動作しているサーバー環境・アクセス元・ページ情報などを連想配列として自動的に格納しています。
$ip = $_SERVER['REMOTE_ADDR'] ?? '不明'; $agent = $_SERVER['HTTP_USER_AGENT'] ?? '不明'; $page = $_SERVER['REQUEST_URI'] ?? '';
| 変数 | 取得できる内容 | 説明 |
|---|---|---|
$_SERVER['REMOTE_ADDR'] | アクセスしてきたクライアント(閲覧者)の IPアドレス | 不正アクセスの追跡やアクセス拒否などに利用できます。社内LANの場合はプライベートIP(例:192.168.x.x)になります。 |
$_SERVER['HTTP_USER_AGENT'] | クライアントの ブラウザやOSの情報 | 例:Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/117.0.0.0。ブラウザやスマホ判定に利用されます。 |
$_SERVER['REQUEST_URI'] | 現在アクセスしている ページのURLパス | 例:/index.php や /shop/cart.php。どのページにアクセスがあったかの記録に使います。 |
他によく使われる $_SERVER パラメータ一覧
| 項目名 | 取得できる情報 | 用途・解説 |
|---|---|---|
$_SERVER['HTTP_REFERER'] | アクセス元ページ(リンク元URL) | どのページから来たかを知る。SNSや検索経由を調べるときに使用。 ※ブラウザ設定により送られない場合あり。 |
$_SERVER['SCRIPT_NAME'] | 実行中のスクリプト名 | 例:/php-accesslog/index.php。現在のPHPファイル名を取得できます。 |
$_SERVER['SERVER_NAME'] | サーバー名(ドメイン) | 例:example.com。環境によっては localhost。 |
$_SERVER['SERVER_ADDR'] | サーバー自身のIPアドレス | レンタルサーバー環境などで確認可能。 |
$_SERVER['SERVER_PORT'] | サーバーのポート番号 | 通常は 80(HTTP)や 443(HTTPS)です。 |
$_SERVER['REQUEST_METHOD'] | 送信メソッド(GET / POST) | フォームの送信方法の判別に使います。 |
$_SERVER['PHP_SELF'] | 現在実行中のスクリプトへのパス | 同一ファイルへのフォーム送信時に利用されます。 |
$_SERVER['DOCUMENT_ROOT'] | サーバー上のルートディレクトリ | 例:/var/www/html。絶対パス指定時に役立ちます。 |
$_SERVER['HTTP_ACCEPT_LANGUAGE'] | ブラウザの言語設定 | 例:ja,en-US;q=0.9。多言語サイトなどで判定可能。 |
| 他の処理 | 解説 |
|---|---|
fopen($file, 'a') | 追記モードで開く(既存内容は保持) |
fwrite($fp, $text) | テキストをファイルに書き込む |
fclose($fp) | ファイルを閉じる |
__DIR__ | 現在のファイルと同じディレクトリを示す定数 |
$_SERVER | サーバー情報を保持するスーパーグローバル変数 |
特定IPを拒否しよう!(deny_ip.php)
<?php
// 迷惑なIPリストを配列で定義
$deny_ips = [
'192.168.1.100',
'203.0.113.50',
'123.45.67.89'
];
// 現在のアクセス元IP
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
// 拒否対象ならアクセス拒否
if (in_array($ip, $deny_ips, true)) {
header('HTTP/1.1 403 Forbidden');
exit('<h1>403 Forbidden</h1><p>アクセスが拒否されました。</p>');
}
?>
in_array()で現在のIPがリストに含まれていれば即終了。header('HTTP/1.1 403 Forbidden')でステータスを明示。exit()で残りの処理を止める。
テストページ
<?php require 'deny_ip.php'; // 拒否処理 require 'accesslog.php'; // ログ記録 ?> <!DOCTYPE html> <html lang="ja"> <head><meta charset="UTF-8"><title>アクセス解析テスト</title></head> <body> <h1>アクセステストページ</h1> <p>このページへのアクセスはログに記録されます。</p> </body> </html>
補足:ユーザーエージェント(User Agent)の見方
アクセスログには、ブラウザやOSなどを示す「ユーザーエージェント情報」が記録されます。
たとえば、$_SERVER['HTTP_USER_AGENT'] の値が次のように出力されることがあります。
Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/117.0.0.0 Safari/537.36
これは、ユーザーがどの環境でアクセスしているかを表す文字列です。
| 部分 | 意味 | 補足説明 |
|---|---|---|
| Mozilla/5.0 | 互換性情報(古い仕様) | すべての主要ブラウザが互換性のために「Mozilla」と名乗っています。特別な意味はありません。 |
| Windows NT 10.0; Win64; x64 | OS情報 | 「Windows 10」で「64ビット版OS」を使用していることを示します。 Macの場合は Macintosh; Intel Mac OS X 10_15_7 などと表示されます。 |
| Chrome/117.0.0.0 | ブラウザ名とバージョン | 「Google Chrome のバージョン117」を使用していることを意味します。 |
| Safari/537.36 | レンダリングエンジン情報 | Chromeも内部的にSafari系エンジン(WebKit / Blink)を利用しているため、この表記が含まれます。 |
ほかの例
| 端末 | 例 | 解説 |
|---|---|---|
| Mac | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15 | Safariブラウザ(macOS Catalina)を使用。 |
| iPhone | Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148 Safari/604.1 | iOS17 の iPhone で Safari を使用。 |
| Android | Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 Chrome/120.0.0.0 Mobile Safari/537.36 | Android13(Pixel 7)で Chrome を使用。 |
