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_errorsとlog_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 が発生します。まずは原因と環境差を確認したうえで、必要な項目だけを安全に初期化することで、実務でも安定した処理が可能になります。