この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: $_SERVER
SEOタイトル: PHP $_SERVER スーパーグローバル変数(DOCUMENT_ROOT / PHP_SELF / REQUEST_URI / HTTP_USER_AGENT / 一覧)

この記事の要点
  • $_SERVERサーバ情報・実行環境・クライアントから送信されたヘッダを格納する PHP スーパーグローバル変数
  • $_SERVER["DOCUMENT_ROOT"]$_SERVER["PHP_SELF"] のように要素キーで値を取り出す
  • クライアント由来の値HTTP_* / REQUEST_URI / QUERY_STRING 等)は偽装可能のため、無加工で出力すると XSS / ヘッダインジェクションになる
  • PHP-CLI と PHP-FPM / mod_php で使えるキーが異なるHTTP_HOSTREQUEST_URI は Web サーバ経由のみ
  • 配列は print_r($_SERVER) / var_dump($_SERVER)全キーを確認できる

$_SERVER とは

$_SERVER は PHP のスーパーグローバル変数(どこからでもアクセスできる組み込み配列)の 1 つで、Web サーバや実行環境、クライアントから送信された情報がキー付きで格納されています。Web アプリケーションでリクエスト元の URL、IP、ユーザーエージェント、リファラなどを取得するときに使います。

基本構文

echo $_SERVER['DOCUMENT_ROOT'];     // /var/www/html
echo $_SERVER['PHP_SELF'];          // /index.php
echo $_SERVER['REQUEST_URI'];       // /index.php?id=10
echo $_SERVER['HTTP_USER_AGENT'];   // Mozilla/5.0 ...
echo $_SERVER['REMOTE_ADDR'];       // 接続元 IP

主要な要素一覧

パス / 実行ファイル系

キー意味
DOCUMENT_ROOTドキュメントルートのフルパス/var/www/html
SCRIPT_FILENAME実行中スクリプトの絶対パス/var/www/html/index.php
SCRIPT_NAME実行中スクリプトのドキュメントルートからの相対パス/index.php
PHP_SELF同上(path_info を含む)/index.php/foo

リクエスト URL 系

キー意味
REQUEST_URIクエリを含むリクエストパス/article?id=10
QUERY_STRING?以降のクエリ文字列id=10&page=2
REQUEST_METHODHTTP メソッドGET / POST
HTTPSHTTPS なら onon / 未設定
SERVER_PROTOCOLHTTP バージョンHTTP/1.1

クライアント / 接続元系

キー意味
REMOTE_ADDR接続元 IP203.0.113.10
REMOTE_PORT接続元ポート54321
HTTP_USER_AGENTブラウザの UA 文字列Mozilla/5.0 ...
HTTP_REFERER遷移元 URLhttps://google.com/
HTTP_ACCEPT_LANGUAGE言語設定ja,en;q=0.8
HTTP_HOSTリクエスト先ホストexample.com
HTTP_X_FORWARDED_FORプロキシ経由の元 IP203.0.113.10

サーバ系

キー意味
SERVER_NAMEサーバ名(VirtualHost 名)example.com
SERVER_ADDRサーバ IP10.0.0.5
SERVER_PORTサーバポート443
SERVER_SOFTWAREWeb サーバの種類nginx/1.25.0
REQUEST_TIMEリクエスト受付時刻(UNIX 時刻)1718000000
REQUEST_TIME_FLOAT同(マイクロ秒精度)1718000000.123

現在の完全な URL を組み立てる

function currentUrl(): string {
    $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
        ? 'https' : 'http';
    $host = $_SERVER['HTTP_HOST'] ?? 'localhost';
    $uri  = $_SERVER['REQUEST_URI'] ?? '/';
    return $scheme . '://' . $host . $uri;
}

echo currentUrl();
// https://example.com/article?id=10

クライアント IP を安全に取る

ロードバランサや CDN(Cloudflare 等)の背後では REMOTE_ADDR はプロキシの IP になります。元のクライアント IP は HTTP_X_FORWARDED_FOR から取得しますが、信頼できるプロキシ経由かを検証しないと偽装されます。

function clientIp(): string {
    // 信頼できる前段プロキシ(CDN / LB)の IP リスト
    $trusted = ['10.0.0.1', '10.0.0.2'];
    $remote  = $_SERVER['REMOTE_ADDR'] ?? '';

    if (in_array($remote, $trusted, true)
        && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // 左端が元クライアント
        $forwarded = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        return trim($forwarded[0]);
    }
    return $remote;
}

安全に出力する

$_SERVER のクライアント由来の値(HTTP_*, REQUEST_URI, PHP_SELF など)は偽装可能です。HTML や属性に埋め込むときは必ずエスケープします。

// NG: そのまま出力すると XSS
echo $_SERVER['HTTP_USER_AGENT'];

// OK: htmlspecialchars でエスケープ
echo htmlspecialchars(
    $_SERVER['HTTP_USER_AGENT'] ?? '',
    ENT_QUOTES | ENT_HTML5,
    'UTF-8'
);

// フォームの action に PHP_SELF を埋め込むのは特に危険
// 
は XSS の温床 // ハードコードか htmlspecialchars 必須

全キーを確認する

// 全キー値を出力(デバッグ用、本番では出さない)
echo '
';
print_r($_SERVER);
echo '
'; // または var_dump var_dump($_SERVER);

CLI 実行時の違い

PHP を php script.php のようにコマンドラインから実行すると、HTTP_*REQUEST_URI など Web リクエスト由来の要素は存在しません。代わりに argv / argc が使えます。

// CLI のみ
echo $_SERVER['argv'][0];  // スクリプトファイル名
echo $_SERVER['argc'];     // 引数の個数
print_r($_SERVER['argv']); // 全引数

// 環境分岐
if (php_sapi_name() === 'cli') {
    echo "CLI mode\n";
} else {
    echo "Web mode\n";
}

$_SERVER と関連スーパーグローバル

変数用途
$_SERVERサーバ / 環境 / リクエスト情報
$_GETクエリ文字列の値
$_POSTPOST ボディの値
$_COOKIECookie の値
$_SESSIONセッション変数
$_FILESアップロードファイル
$_REQUEST$_GET + $_POST + $_COOKIE のマージ
$_ENV環境変数

FAQ

Q: HTTP_HOST と SERVER_NAME どちらを使うべき?
A: HTTP_HOST はクライアントが送ったヘッダ(偽装可)、SERVER_NAME はサーバ設定(VirtualHost)由来。多くの場合 HTTP_HOST が便利ですが、絶対 URL を組む際は許可ホストのホワイトリスト検証を入れます。

Q: REQUEST_TIME と time() の違いは?
A: $_SERVER['REQUEST_TIME'] はリクエスト受付時刻で固定。time() は呼び出し時の現在時刻。リクエスト全体で同じ「現在時刻」を扱いたいなら REQUEST_TIME。

関連

  • スーパーグローバル変数 — PHP の組み込み配列
  • $_GET / $_POST — リクエストパラメータ
  • htmlspecialchars — XSS 対策のエスケープ
  • filter_input — INPUT_SERVER 等で安全に取得