PHPの$_SERVERが未定義になる原因と対処方法(初期化コード付き)

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

PHP で開発していると、環境によって $_SERVER の中身が大きく異なり、特定のキーが存在せず Notice が発生することがあります。特にスマホ回線・CDN・CLI などの特殊な環境では、思っている以上に欠落が起こります。本記事では「なぜ未定義になるのか」という原因と、実務で安全に使える初期化コードをまとめて解説します。

未定義の $_SERVER を初期化するコード(結論)

まず先に、未定義の $_SERVER を安全に初期化するためのコードを提示します。実務では、環境によって存在しないキーが混在するため、必要最低限の値だけを初期化する形が安全です。

<?php
// サーバ変数が未定義なら空をセットする
$a = [
    'HTTPS',
    'HTTP_HOST',
    'REMOTE_ADDR',
    'HTTP_REFERER',
    'REQUEST_URI',
    'HTTP_USER_AGENT',
    'HTTP_UA_PIXELS',
    'HTTP_X_UP_DEVCAP_SCREENPIXELS',
    'HTTP_ACCEPT',
    'HTTP_X_DCMGUID'
];
foreach ($a as $key){
    if ( ! array_key_exists($key, $_SERVER)) {
        $_SERVER[$key] = '';
    }
}
unset($a);
?>

この形式で初期化すると、ログやバグ調査に必要な値を壊さず、未定義エラー(Notice)だけを抑制できます。

なぜ $_SERVER が未定義になるのか(原因)

$_SERVER の中身は「サーバー環境」「実行方法」「ネットワーク経路」に強く依存しており、必ずしも全てのキーが存在するわけではありません。以下は事実に基づく主な理由です。

  • CLI(コマンドライン)や cron 実行時は多くのキーが存在しない
  • CDN(例:Cloudflare)やリバースプロキシを経由すると空になる項目がある
  • スマートフォンのキャリア回線は HTTP_REFERER を落とすことがある
  • Apache/Nginx の設定によって一部の値が生成されない
  • ブラウザやアプリが意図的にヘッダーを送らない場合がある

$_SERVER の欠落が起こりやすい代表的な環境

  • CLI / バッチ処理(REQUEST_URI, HTTP_USER_AGENT が存在しない)
  • CDN(HTTP_X_FORWARDED_FOR などが増え、REMOTE_ADDR が変化する)
  • スマホ回線(HTTP_REFERER がほぼ空)
  • プロキシ環境(PROXY 経由で REQUEST_URI が書き換わることがある)

状況を確認する方法(再現・デバッグ)

まずは実際にその環境で $_SERVER の内容を確認するのが確実です。

<?php
echo '<pre>';
var_dump($_SERVER);
echo '</pre>';
?>

この出力結果から「そもそも存在しないキー」なのか「存在するはずが落ちている」のかが分かります。環境差の切り分けに必須です。

初期化するときの注意点(安全性と可読性)

  • 必要のない値まで初期化しない(デバッグ時に情報が失われる)
  • HTTP ヘッダーは改ざん可能なので、値を無条件に信用しない
  • REMOTE_ADDR は Cloudflare 等で本来の値ではない場合がある
  • 初期化は「未定義エラーを防ぐ」ためであり、「正しい値を保証する」ものではない

関連する PHP 設定・仕様

  • error_reporting(E_ALL):未定義 Notice を確実に拾える
  • display_errorslog_errors の設定で挙動が変わる
  • variables_order = "EGPCS"$_SERVER をどの順番で取り込むか
  • PHP の実行 SAPI(CLI, FPM, Apache モジュール)によって内容が変わる

実務でよく遭遇するパターン

  • Cloudflare 経由で REMOTE_ADDR が CF-Connecting-IP に変わる
  • スマホサイトで HTTP_REFERER が常に空になる
  • 管理画面だけ HTTP_USER_AGENT が空で送信されるケース(アプリ内ブラウザ)
  • cron 実行で REQUEST_URI が存在せず Notice が多発

まとめ

$_SERVER は環境によって内容が大きく変わるため、想定していないキーに依存すると Notice が発生します。まずは原因と環境差を確認したうえで、必要な項目だけを安全に初期化することで、実務でも安定した処理が可能になります。