PHPではサーバー情報と実行時の環境情報を調べたい場合は$_SERVERを使う。
私もよく$_SERVERを使うが、中身を詳しく見たことがない。
マニュアルには日本語の説明もあるのに。
そこで、今回は$_SERVERの中身をじっくりと見てみることにする。
ただ見るだけではよく分からないと思うので、マニュアルの$_SERVERの説明を一緒に表示することにした。
$_SERVERの中身を出力(日本語の説明付き)
クライアント・サーバーの環境・条件によって参照できる情報は変わるので、今回はとりあえずPHPのマニュアルに載っている項目だけを扱う。
単に他のサーバーが返してくれる情報を知りたい場合は、ネットで検索すれば出てくる。
今回はあくまで、自分の環境でPHPで調べるというもの。
以下のコードをコピペするだけで実行できる。
日本語の説明はマニュアルからコピペした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>$_SERVER</title> <style> table, td { border-collapse: collapse; border: 1px #ccc solid; padding: 10px; } hr { border-width: 1px 0 0 0; border-style: dotted; border-color: #ccc; } </style> </head> <body> <?php $explanations = [ "PHP_SELF" => "現在実行しているスクリプトのファイル名です。ドキュメントルートから取得されます。例えば、http://example.com/foo/bar.phpというアドレス上にあるスクリプトでは\$_SERVER['PHP_SELF']は/foo/bar.phpとなります。__FILE__定数には、カレント(すなわち読み込まれた)ファイルのパスとファイル名が含まれます。PHPがコマンドラインから実行される場合、PHP4.3.0以降、この変数にはスクリプト名が含まれます。これより前のバージョンでは、この変数は使用できません。", "argv" => "スクリプトに渡された引数の配列です。スクリプトがコマンドラインから実行された場合、C言語スタイルでコマンドライン引数にアクセスすることができます。GETメソッドを通してコールされた場合には検索引数が格納されます。", "argc" => "スクリプトに渡されたコマンドライン引数の数(コマンドラインから実行した場合)です。", "GATEWAY_INTERFACE" => "サーバーが使用しているCGIのバージョンです。例'CGI/1.1'", "SERVER_ADDR" => "現在のスクリプトが実行されているサーバーのIPアドレスです。", "SERVER_NAME" => "現在のスクリプトが実行されているサーバーのホスト名です。スクリプトがバーチャルホスト上で実行されている場合はそのバーチャルホスト名となります。注意:Apache2では、UseCanonicalName=OnとServerNameを設定する必要があります。そうしなければ、この値はクライアントが提供するホスト名を指すようになってしまい、無意味です。また、セキュリティ的な意味合いでこの値に頼ってはいけません。", "SERVER_SOFTWARE" => "レスポンスヘッダ上に書かれている、サーバーの認識文字列です。", "SERVER_PROTOCOL" => "ページがリクエストされた際のプロトコル名とバージョンです。例.'HTTP/1.0'", "REQUEST_METHOD" => "ページにアクセスする際に使用されたリクエストのメソッド名です。'GET','HEAD','POST','PUT'など。注意:リクエストのメソッドがHEADだった場合、PHPスクリプトはヘッダを送信した後(言い換えれば、出力バッファリングを行わずに全出力を処理した後)に終了します。", "REQUEST_TIME" => "リクエストの開始時のタイムスタンプ。PHP5.1.0以降で利用可能。", "REQUEST_TIME_FLOAT" => "リクエストの開始時のタイムスタンプ(マイクロ秒までの精度)。PHP5.4.0以降で利用可能。", "QUERY_STRING" => "ページがアクセスされた際にもし検索引数があればそれが格納されます。", "DOCUMENT_ROOT" => "現在実行されているスクリプトが存在するドキュメントルートディレクトリです。サーバーのコンフィグレーションファイルで定義されています。", "HTTP_ACCEPT" => "現在のリクエストのAccept:ヘッダがもしあればその内容。", "HTTP_ACCEPT_CHARSET" => "現在のリクエストのAccept-Charset:ヘッダがもしあればその内容。例:'iso-8859-1,*,utf-8'", "HTTP_ACCEPT_ENCODING" => "現在のリクエストにAccept-Encoding:ヘッダがもしあればその内容。例:'gzip'", "HTTP_ACCEPT_LANGUAGE" => "現在のリクエストにAccept-Language:ヘッダがもしあればその内容。例:'en'", "HTTP_CONNECTION" => "現在のリクエストにConnection:ヘッダがもしあればその内容。例:'Keep-Alive'", "HTTP_HOST" => "現在のリクエストにHost:ヘッダがもしあればその内容。", "HTTP_REFERER" => "現在のページに遷移する前にユーザーエージェントが参照していたページのアドレス(もしあれば)。これはユーザーエージェントによってセットされます。全てのユーザーエージェントがこれをセットしているわけではなく、また、HTTP_REFERERを変更する機能を持つものもあります。要するに、信頼するべきものではありません。", "HTTP_USER_AGENT" => "現在のリクエストにUser-Agent:ヘッダがもしあればその内容。ページにアクセスしてきているユーザーエージェントのしるしの文字列です。典型的な例は、Mozilla/4.5[en](X11;U;Linux2.2.9i586)。たとえば、get_browser()でこの値を使ってページの出力をそのブラウザにあわせたものにすることもできるでしょう。", "HTTPS" => "スクリプトがHTTPSプロトコルを通じて実行されている場合に空でない値が設定されます。注意:ISAPIをIISで使用している場合は、HTTPSプロトコルを通さないでリクエストが行われたときの値はoffとなることに注意しましょう。", "REMOTE_ADDR" => "現在ページをみているユーザーのIPアドレス。", "REMOTE_HOST" => "現在のページにアクセスしているホスト名。DNSの逆引き検索はユーザーのREMOTE_ADDRに基づいています。注意:Webサーバーがこの値を生成できるように設定されている必要があります。例えばApacheの場合HostnameLookupsOnがhttpd.confに設定されていなければこの値は生成されません。gethostbyaddr()もご覧ください。", "REMOTE_PORT" => "ユーザーのマシンからWebサーバーへの通信に使用されているポート番号", "REMOTE_USER" => "認証されたユーザー。", "REDIRECT_REMOTE_USER" => "リクエストが内部でリダイレクトされた場合の認証されたユーザー。", "SCRIPT_FILENAME" => "現在実行されているスクリプトの絶対パス。注意:file.phpあるいは../file.phpのような相対パスを指定してCLIでスクリプトが実行されている場合、\$_SERVER['SCRIPT_FILENAME']にはユーザーが指定した相対パスが含まれます。", "SERVER_ADMIN" => "Webサーバーの設定ファイルのSERVER_ADMIN(Apacheの場合)ディレクティブにセットされている値。スクリプトがバーチャルホスト上で実行されている場合、バーチャルホストに対して値が定義されます。", "SERVER_PORT" => "Webサーバーの通信ポートとして使用されているポート番号。デフォルトでは'80'ですが、例えばSSLを使用している場合はセキュアHTTPポートとして設定されている値に変わります。注意:Apache2では、UseCanonicalName=OnだけでなくUseCanonicalPhysicalPort=Onも設定しないと物理ポート(実際のポート)を取得できません。設定しなければ、この値は詐称できる状態になり、物理ポートを返さなくなるかもしれません。セキュリティに依存するコンテキストで、この値に頼るのは安全ではありません。", "SERVER_SIGNATURE" => "サーバー上で生成されたページに追加される、サーバーのバージョン名とバーチャルホスト名の文字列。Webサーバーの設定で有効になっていることが必要です。", "PATH_TRANSLATED" => "バーチャルからリアルへのマッピングがなされた後の、現在のスクリプトのファイルシステム上(ドキュメントルートではなく)でのパス。注意:PHP4.3.2以降、PATH_TRANSLATEDは、Apache2SAPIにおいて暗黙のうちに設定されなくなりました。一方、Apache1では、この値がApacheにより設定されない場合、SCRIPT_FILENAMEと同じ値に設定されます。この変更は、PATH_TRANSLATEDはPATH_INFOが定義されている場合のみ存在するべきであるというCGIの規約を満たすために行われました。Apache2ユーザーは、PATH_INFOを定義するためにhttpd.confの中でAcceptPathInfo=Onを使用することが可能です。", "SCRIPT_NAME" => "現在のスクリプトのパス。スクリプト自身のページを指定するのに有用です。__FILE__定数には、カレント(すなわち読み込まれた)ファイルのパスとファイル名が含まれます。", "REQUEST_URI" => "ページにアクセスするために指定されたURI。例えば、'/index.html'", "PHP_AUTH_DIGEST" => "HTTPダイジェスト認証を行っている場合、クライアントから送られた'Authorization'ヘッダの内容が設定されます(適切な認証処理を行うために利用します)。", "PHP_AUTH_USER" => "HTTP認証しているときにそのユーザー名がセットされます。", "PHP_AUTH_PW" => "HTTP認証しているときにそのユーザーのパスワードがセットされます。", "AUTH_TYPE" => "HTTP認証しているときにその認証形式がセットされます。", "PATH_INFO" => "実際のスクリプトファイル名とクエリ文字列の間にある、クライアントが提供するパス名情報。たとえば、現在のスクリプトにhttp://www.example.com/php/path_info.php/some/stuff?foo=barというURLでアクセスしていた場合の\$_SERVER['PATH_INFO']は/some/stuffとなります。", "ORIG_PATH_INFO" => "PHPで処理される前の'PATH_INFO'の原本。" ]; ?> <h1>$_SERVER</h1> <h2>自分の環境</h2> <table> <?php foreach($_SERVER as $key=>$value): ?> <tr> <td>$_SERVER["<?= $key ?>"]</td> <td><?= $value ?><br><?php echo (!empty($explanations[$key])) ? '<hr>'.$explanations[$key] : ""; ?></td> </tr> <?php unset($explanations[$key]); ?> <?php endforeach; ?> </table> <h2>自分の環境で使用していないもの</h2> <table> <?php foreach($explanations as $key=>$value): ?> <tr> <td>$explanations["<?= $key ?>"]</td> <td><?= $value ?></td> </tr> <?php endforeach; ?> </table> </body> </html> |
実行イメージ
感想
PHPのマニュアルに載っていない項目が結構あった。
ただ、見れば分かるものが多く、それほど重要でもなさそう。
1つ興味をひかれたのは”HTTP_DNT”。
HTTP_DNTはDo Not Trackという意味で、プライベートブラウズかどうかを判定できる。
プライベートブラウズを使うと、クライアント側は広告会社などにトラッキングしないよう求めることができる。
その結果、広告が表示されなくなるので、広告収入を狙っている人にとっては大敵だ。
自分が使う分には便利だけどね。