PHPを使ってIPアドレスでアクセス解析をしてみよう!

学習目的

運用を行う中で、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; x64OS情報「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)を利用しているため、この表記が含まれます。

ほかの例

端末解説
MacMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15Safariブラウザ(macOS Catalina)を使用。
iPhoneMozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148 Safari/604.1iOS17 の iPhone で Safari を使用。
AndroidMozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 Chrome/120.0.0.0 Mobile Safari/537.36Android13(Pixel 7)で Chrome を使用。