PHP 入門

PHP $_SERVER

$_SERVER は、Web サーバーから提供されるヘッダー情報(headers)、パス(paths)、スクリプトの場所(script locations)などを含む連想配列です。$_GET$_POST のようにユーザーから送信されるデータとは異なり、これらの値は実行環境(Execution Environment)自体によって生成されます。開発者がこれらを定義する必要はありません。リクエストがスクリプトに到達した瞬間、サーバーによって自動的にこのアレイが作成されます。

1. サーバー情報と実行コンテキストへのアクセス

$_SERVER はスーパーグローバル(superglobal)変数であるため、スクリプト内のあらゆるスコープから直接アクセスできます。主に、ユーザーがどのようにページにアクセスしたかの判定、使用しているブラウザの特定、または異なる開発環境間でも互換性を維持できる絶対 URL の構築などに使用されます。

<?php
// リクエストメソッド(GET か POST か)をチェック
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    echo "フォームは POST 方式で送信されました。";
}

// 現在のスクリプトのパスを取得
echo "現在のファイル:" . $_SERVER['PHP_SELF'];

// 訪問者の IP アドレスを取得
echo "あなたの IP アドレス:" . $_SERVER['REMOTE_ADDR'];
?>

2. $_SERVER アレイの主要なキーと値

このアレイには数十のキーが含まれていますが、その多くはサーバーソフトウェア(Apache や Nginx など)に依存した特定のものです。ただし、日常的な開発で頻繁に利用する標準的なキーがいくつか存在します。

キー名 (Key)説明 (Description)
PHP_SELF現在実行中のスクリプトのファイル名(ドキュメントルートからの相対パス)。
SERVER_NAMEスクリプトが実行されているサーバーのホスト名。
REQUEST_METHODページにアクセスする際に使用されたリクエストメソッド(例:GET, POST, PUT)。
QUERY_STRINGページアクセス時のクエリ文字列(URL 内の ? 以降の部分)。
HTTP_USER_AGENTページにアクセスしているユーザーエージェント(ブラウザ/クライアント)の情報。
REMOTE_ADDR現在のページを閲覧しているユーザーの IP アドレス。
SCRIPT_FILENAME現在実行中のスクリプトの絶対パス名。

3. 実行フローとサーバー変数

クライアントがリクエストを送信すると、Web サーバーは PHP エンジンに制御を渡す前に、リクエストのメタデータ(metadata)を処理します。$_SERVER は、サーバー低レイヤーのリクエスト処理メカニズムと、PHP のビジネスロジックを繋ぐ架け橋のような役割を果たします。

ライフサイクルは以下のステップで理解できます:

  1. ユーザー (User) が HTTP リクエストを送信(例:GET /index.php)。
  2. サーバー (Server) がリクエストを受信し、自動的に $_SERVER アレイを生成。
  3. PHP が処理を引き継ぎ、$_SERVER 内のデータを利用してビジネスロジックを実行。
  4. PHP がレスポンスを生成し、サーバーに返す。
  5. サーバー が最終的な HTML 出力をユーザーに送信。

4. 実践的な応用:フォーム送信の保護

$_SERVER の一般的なユースケースとして、セキュリティポリシーやルーティングルールの強制があります。例えば、$_SERVER['HTTP_REFERER'] を使用して、リクエストが自サイトの特定のページから送信されたかを確認したり、$_SERVER['REQUEST_METHOD'] を使用して、ユーザーがブラウザのアドレスバーに URL を直接入力してデータ処理スクリプトを意図せず実行するのを防いだりできます。

<?php
// データ処理スクリプトへの直接アクセスを防止
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    die("直接アクセスは許可されていません。フォームから送信してください。");
}

// ユーザーが指定したコンタクトページから来ているかを確認
$expected_referer = "https://example.com/contact.php";
if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== $expected_referer) {
    die("セキュリティ違反:無効なリファラです。");
}

echo "データを安全に処理しています...";
?>
セキュリティ上の警告:HTTP_USER_AGENTHTTP_REFERER を、認証や重要なセキュリティチェックに決して使用しないでください。これらの HTTP ヘッダー情報は、悪意のあるクライアントによって極めて容易に偽装(スプーフィング / Spoofing)される可能性があります。これらは、ログ記録、データ分析、または UI の微調整のみに使用するようにしてください。