【PHP】スーパーグローバル変数$_SERVER

## $_SERVERとは

$_SERVERとは、**PHPの定義済み変数のひとつ**で、PHPが稼働しているWebサーバーが生成するヘッダ情報、パス情報、スクリプトの位置のような情報を提供する連想配列となっています。

つまり、**HTTPサーバーやHTTP通信に関わる情報を取得したい場合に$_SERVERを使用します**。

## $_SERVER変数一覧

+ **$_SERVER['PHP_SELF']**
  現在実行しているスクリプトのファイル名です。ドキュメントルートから取得。
  例) inquiry/input.php
  <br>
+ **$_SERVER['GATEWAY_INTERFACE']**
  サーバーが使用しているCGIのバージョンを取得。
  例) CGI/1.1
  ※CGIとは、クライアント側のWebブラウザの要求に応じてWebサーバが外部プログラムを呼び出して、その実行結果がHTTPを介してクライアントのWebブラウザに送信される仕組み
  <br>
+ **$_SERVER['SERVER_ADDR']**
  現在のスクリプトが実行されているサーバーのIPアドレスを取得。
  例) 127.0.0.1
  <br>
+ **$_SERVER['SERVER_NAME']**
  現在のスクリプト上で実行されているサーバーのホスト名を取得。
  例) www.google.com
  <br>
+ **$_SERVER['SERVER_SOFTWARE']**
  レスポンスヘッダ上に書かれている、サーバーの識別文字列を取得。
  例) Apache 2.4.54
  <br>
+ **$_SERVER['SERVER_PROTOCOL']**
  ページがリクエストされた際のプロトコル名とバージョンを取得。
  例) HTTP/1.0
  <br>
+ **$_SERVER['REQUEST_METHOD']**
  ページにアクセスする際に使用されたリクエストのメソッド名を取得。
  例) GET, POST, PUT, HEADなど
  <br>
+ **$_SERVER['REQUEST_TIME']**
  リクエストの開始時のタイムスタンプを取得。
  例) 1685946026
  ※タイムスタンプとは、インターネット上の取引や手続き等が行われた時刻や電子文書の存在した日時を証明するサービス
  <br>
+ **$_SERVER['REQUEST_TIME_FLOAT']**
  リクエストの開始時のタイムスタンプ (マイクロ秒までの精度)を取得。
  例) 1685946171.2473
  <br>
+ **$_SERVER['QUERY_STRING']**
  ページがアクセスされた際にもし検索引数があればそれ値を取得。
  例) ?page=2&id=8
  <br>
+ **$_SERVER['DOCUMENT_ROOT']**
現在実行されているスクリプトが存在するドキュメントルート ディレクトリを取得。
例) C:/xampp/htdocs
　<br>
+ **$_SERVER['HTTPS']**
  スクリプトが HTTPS プロトコルを通じて実行されている場合に 空でない値が設定される。
  注意: ISAPI を IIS で使用している場合は、HTTPS プロトコルを通さないでリクエストが行われたときの値は off となる
  <br>
+ **$_SERVER['HTTP_ACCEPT']**
  現在のリクエストの Accept: ヘッダがもしあればその内容を取得。
  例) text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
  <br>
+ **$_SERVER['HTTP_ACCEPT_CHARSET']**
  現在のリクエストの Accept-Charset: ヘッダが もしあればその内容を取得。
  例) UTF-8
  <br>
+ **$_SERVER['HTTP_ACCEPT_ENCODING']**
  現在のリクエストに Accept-Encoding: ヘッダが もしあればその内容を取得。
  例) gzip, deflate, br
  <br>
+ **$_SERVER['HTTP_ACCEPT_LANGUAGE']**
  現在のリクエストに Accept-Encoding: ヘッダが もしあればその内容を取得。
  例) ja,en-US;q=0.9,en;q=0.8
  <br>
+ **$_SERVER['HTTP_CONNECTION']**
  現在のリクエストに Connection: ヘッダが もしあればその内容を取得。
  例) keep-alive
  <br>
+ **$_SERVER['HTTP_HOST']**
  現在のリクエストに Host: ヘッダが もしあればその内容を取得。
  例) localhost
  <br>
+ **$_SERVER['HTTP_REFERER']**
  現在のページに遷移する前にユーザエージェントが参照していたページのアドレスを取得。全てのユーザエージェントがこれをセットしているわけではなく、HTTP_REFERER を変更する機能を持つものもあります。 要するに、信頼するべきものではありません。
  例) http://localhost/test.php
  <br>
+ **$_SERVER['HTTP_USER_AGENT']**
  現在のリクエストに User-Agent: ヘッダが もしあればその内容を取得。ページにアクセスしてきているユーザエージェントのしるしの文字列。
  例) Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
  <br>
+ **$_SERVER['REMOTE_ADDR']**
  現在ページをみているユーザーの IP アドレスを取得。
  例) 127.0.0.1
  <br>
+ **$_SERVER['REMOTE_HOST']**
  現在のページにアクセスしているホスト名を取得。DNS の逆引き検索は ユーザーの REMOTE_ADDR に基づいています。
  注意: Webサーバーがこの値を生成できるように設定されている必要がある。例えばApache の場合 HostnameLookups On が httpd.conf に設定されていなければこの値は生成されない。
  <br>
+ **$_SERVER['REMOTE_PORT']**
  ユーザーのマシンから Web サーバーへの通信に使用されているポート番号を取得。
  例) 52299
  <br>
+ **$_SERVER['REMOTE_USER']**
  認証されたユーザー名を取得。
  <br>
+ **$_SERVER['REDIRECT_REMOTE_USER']**
  リクエストが内部でリダイレクトされた場合の認証されたユーザー名を取得。
  <br>
+ **$_SERVER['SCRIPT_FILENAME']**
  現在実行されているスクリプトの絶対パスを取得。
  注意: file.php あるいは ../file.php のような相対パスを指定して CLI でスクリプトが実行されている場合、$_SERVER['SCRIPT_FILENAME'] にはユーザーが指定した相対パスが含まれます。
  例) C:/xampp/htdocs/test.php
  <br>
+ **$_SERVER['SERVER_ADMIN']**
  Webサーバーの設定ファイルの SERVER_ADMIN (Apacheの場合)ディレクティブにセットされている値を取得。
  例) postmaster@localhost
  <br>
+ **$_SERVER['SERVER_PORT']**
  Webサーバーの通信ポートとして使用されているポート番号を取得。
  注意: Apache2 では、UseCanonicalName = On だけでなく UseCanonicalPhysicalPort = On も設定しないと物理ポート(実際のポート) を取得できません。設定しなければ、この値は詐称できる状態になり、物理ポートを返さなくなるかもしれません。セキュリティに依存するコンテキストで、この値に頼るのは安全ではない。
  例) 80
  <br>
+ **$_SERVER['SERVER_SIGNATURE']**
  サーバー上で生成されたページに追加される、サーバーのバージョン名とバーチャルホスト名の文字列を取得。 Webサーバーの設定で有効になっていることが必要。
  例) Apache/2.4.54 (Win64) OpenSSL/1.1.1p PHP/7.4.33 Server at localhost Port 80
  <br>
+ **$_SERVER['PATH_TRANSLATED']**
  バーチャルからリアルへのマッピングがなされた後の、現在のスクリプトのファイルシステム上（ドキュメントルートではなく）でのパスを取得。
  注意: Apache2 ユーザーは、PATH_INFO を定義するために httpd.conf の中で AcceptPathInfo = On を使用することが可能です。
  <br>
+ **$_SERVER['SCRIPT_NAME']**
  現在のスクリプトのパスを取得。スクリプト自身のページを指定するのに有用です。FILE定数には、カレント(すなわち読み込まれた)ファイルのパスとファイル名が含まれます。
  例) /test.php
  <br>
+ **$_SERVER['REQUEST_URI']**
  ページにアクセスするために指定された URI を取得。
  例) /test.php
  <br>
+ **$_SERVER['PHP_AUTH_DIGEST']**
  HTTPダイジェスト認証を行っている場合、クライアントから送られた'Authorization'ヘッダの内容を取得。
  <br>
+ **$_SERVER['PHP_AUTH_USER']**
  HTTP認証しているときにそのユーザー名がセットされる。
  <br>
+ **$_SERVER['PHP_AUTH_PW']**
  HTTP認証しているときにそのユーザーのパスワードがセットされる。
  <br>
+ **$_SERVER['AUTH_TYPE']**
  HTTP認証しているときにその認証形式がセットされる。
  <br>
+ **$_SERVER['PATH_INFO']**
  実際のスクリプトファイル名とクエリ文字列の間にある、クライアントが提供するパス名情報を取得。
  例) http://www.example.com/php/path_info.php/some/stuff?foo=bar という URI でアクセスしていた場合は、/some/stuff
  <br>
+ **$_SERVER['ORIG_PATH_INFO']**
  PHPで処理される前の 'PATH_INFO' の原本を取得。

## サンプル

```php:test.php
<?php

// 実行されているスクリプトのファイル名
echo 'ファイル名 : '. $_SERVER['PHP_SELF'];

// スクリプトが実行されているサーバーのIPアドレス
echo 'IPアドレス'.$_SERVER['SERVER_ADDR'];

// スクリプトが実行されているサーバのホスト名
echo 'ホスト名'.$_SERVER['SERVER_NAME'];

実行結果
ファイル名 : test.php
IPアドレス : 127.0.0.1
ホスト名 : localhost
```

## 参考

+ [PHP公式リファレンス $_SERVER](https://www.php.net/manual/ja/reserved.variables.server.php)
+ [PHP $_SERVER（サーバー変数）のすべて！【初心者向け基本】](https://wepicks.net/phpref-server/)

<br>
著者: E.R (株式会社ウィズツーワン)