タイトル: $_SERVER
SEOタイトル: PHP $_SERVER スーパーグローバル変数(DOCUMENT_ROOT / PHP_SELF / REQUEST_URI / HTTP_USER_AGENT / 一覧)
| この記事の要点 |
|
$_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_METHOD | HTTP メソッド | GET / POST |
HTTPS | HTTPS なら on | on / 未設定 |
SERVER_PROTOCOL | HTTP バージョン | HTTP/1.1 |
クライアント / 接続元系
| キー | 意味 | 例 |
|---|---|---|
REMOTE_ADDR | 接続元 IP | 203.0.113.10 |
REMOTE_PORT | 接続元ポート | 54321 |
HTTP_USER_AGENT | ブラウザの UA 文字列 | Mozilla/5.0 ... |
HTTP_REFERER | 遷移元 URL | https://google.com/ |
HTTP_ACCEPT_LANGUAGE | 言語設定 | ja,en;q=0.8 |
HTTP_HOST | リクエスト先ホスト | example.com |
HTTP_X_FORWARDED_FOR | プロキシ経由の元 IP | 203.0.113.10 |
サーバ系
| キー | 意味 | 例 |
|---|---|---|
SERVER_NAME | サーバ名(VirtualHost 名) | example.com |
SERVER_ADDR | サーバ IP | 10.0.0.5 |
SERVER_PORT | サーバポート | 443 |
SERVER_SOFTWARE | Web サーバの種類 | 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 を埋め込むのは特に危険
// <form action="<?= $_SERVER['PHP_SELF'] ?>"> は XSS の温床
// ハードコードか htmlspecialchars 必須
全キーを確認する
// 全キー値を出力(デバッグ用、本番では出さない)
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
// または 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 | クエリ文字列の値 |
$_POST | POST ボディの値 |
$_COOKIE | Cookie の値 |
$_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 等で安全に取得