HTTPユーザーエージェント(Webブラウザ)がWebサーバにアクセスする際,HTTPリクエストヘッダにクライアント側の各種情報を含めて送信します。リクエストを受け取った側がCGIやPHPなどのプログラムの場合,HTTPリクエストヘッダの情報や,アクセス元のIPアドレス,TCPポート番号などの情報を環境変数に設定します。環境変数にはクライアント側の情報だけでなく,サーバ側の情報も含まれます。これらの情報もとに,スマートフォンからPC用のコンテンツにアクセスした場合,スマートフォン向けのコンテンツに転送することができます。また,使用しているOSやブラウザによりダウンロードするファイルを振り分けることができます。
1. HTTPリクエストヘッダ情報
ユーザーエージェントがサーバにリクエストする際の追加情報。ユーザーエージェント自身に関する詳細情報が含まれます。HTTPリクエストヘッダの情報は,「Accept:」が「HTTP_ACCEPT」のように,ヘッダフィールド名に対応した環境変数で渡されます。なお,HTTPリクエストヘッダ情報によっては容易に偽装や隠蔽することが可能なため,必ずしも正しい情報とはかぎりません。また,リクエストヘッダには「X-」を接頭辞として独自のヘッダを追加できますが,現在これらの独自ヘッダは非推奨(サーバに送信すべきでない)とされています。
HTTP_ACCEPT
Accept:リクエストヘッダの情報(ユーザーエージェントが受け入れ可能なファイルのMIMEタイプ)が設定されます。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
HTTP_COOKIE
Cookie:リクエストヘッダの情報(ユーザーエージェントからWebサーバに送信される,ユーザ識別やセッション管理などを目的とした情報)が設定されます。
HTTP_FORWARDED
Forwarded:リクエストヘッダの情報(ユーザーエージェントからのリクエストがプロキシサーバ(代理サーバ)を経由した際に変更・消失した,クライアント側の情報)が設定されます。
HTTP_HOST
Host:リクエストヘッダの情報(ユーザーエージェントが接続しているWebサーバのホスト名)が設定されます。
Host: www.example.com
※ 「http://www.example.com/xxx.html」にアクセスした場合。
HTTP_REFERER
Referer:リクエストヘッダの情報(ユーザーエージェントのリファラ = 現在のWebページから見たリンク元のURL)が設定されます。リファラを参照することで,訪問者がどこから来ているかを把握することができます。
Referer: http://www.example.com/xxx.html
※ 「http://www.example.com/xxx.html」に設置されたハイパーリンクから,現在のページに遷移してきた場合。直接現在のページのULRを打ち込んだ場合でも,ユーザーエージェントによっては直前に参照していたページのURLが設定されることがある。
HTTP_USER_AGENT
User-Agent:リクエストヘッダの情報(ユーザーエージェントの名称 = ブラウザやウェブクローラーなどのを識別するための文字列)が設定されます。通常は,クライアント側のOS名,アプリケーション名,バージョンナンバーなどで構成されます。
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
※ 「Google Chrome」(Macintosh版)の場合。
HTTP_X_FORWARDED_FOR (非推奨)
X-Forwarded-For:リクエストヘッダの情報を設定。X-Forwarded-For:リクエストヘッダは,ユーザーエージェントがプロキシサーバ(代理サーバ)もしくはロードバランサ(負荷分散装置)経由でHTTP接続するときに追加される独自ヘッダで,Webサーバに接続するクライアント(リクエスト送信元)のIPアドレスを識別します。多段プロキシの場合は,経由したプロキシのIPアドレスがカンマ区切りのリストとして設定されます。
X-Forwarded-For: 192.168.1.200, 192.168.1.30, 192.168.1.31
※ 「192.168.1.200」のクライアントより,IPアドレスが「192.168.1.30」と「192.168.1.31」のプロキシサーバを経由した場合。必ずしもこの順序とは限らず,経由するプロキシサーバやロードバランサによっては,右端にクライアントのIPアドレスが設定されることもある。
2. クライアント情報
HTTPリクエストヘッダ情報以外のクライアント情報です。 TCP/IPのプロトコル構造は,4つの層から構成されています。上位層から順に,アプリケーション層,トランスポート層,インターネット層,ネットワークインターフェース層の4つの層になります。HTTPリクエストヘッダはアプリケーション層が担当します。しかし,アプリケーション層では,TCPポート番号やIPアドレスは担当外となっているため,HTTPリクエストヘッダには含まれません。では,TCPポート番号やIPアドレスはどこにあるのでしょうか。HTTPのリクエストが開始する前に,クライアントとサーバが接続している必要があります。したがって,TCPポート番号やIPアドレスはアプリケーション層よりも下位の層で使用されます。TCP/UDPポートはアプリケーション間のデータ転送を担当するトランスポート層で,IPアドレスはクライアントとサーバ間の通信を担当するインターネット層にて割り当てられます。
REMOTE_ADDR
クライアントの接続元IPアドレスです。ユーザーエージェントがプロキシサーバ(代理サーバ)もしくはロードバランサ(負荷分散装置)経由した場合は,プロキシサーバやロードバランサのIPアドレスとなります。
REMOTE_HOST
「REMOTE_ADDR」で取得したIPアドレスをもとに,Domain Name System(DNS)で逆引きしたホスト名となります。しかし,必ずしもホスト名を取得するわけでなく,サーバの負荷を軽減するため,「REMOTE_HOST」が設定されない場合もあります。
REMOTE_PORT
接続をリクエストしてきたユーザーエージェントに割り当てられたTCPポート番号が設定されます。サーバは,このポート番号に対してレスポンスを返信します。
QUERY_STRING
URLの引数として渡された値が設定されます。「http://www.example.com/xxx.cgi?page=1」の場合,「page=1」の部分が引数となります。
UNIQUE_ID
一意な識別子が設定されます。この識別子はリクエストごとにサーバからユーザーエージェントに付与されます。
3. サーバ情報
サーバの内部情報です。サーバ情報はクライアント側から送信された情報でなく,主にサーバ側のコンフィグレーションファイルで定義された情報が設定されます。
DOCUMENT_ROOT
PerlやPHPなど,現在実行されているスクリプトが存在するドキュメントルートディレクトリが設定されます。
SERVER_ADMIN
サーバ管理者のEmailアドレスが設定されます(Web サーバのSERVER_ADMINディレクティブ設定値)。
SERVER_NAME
PerlやPHPなど,現在のスクリプトが実行されているサーバのホスト名が設定されます(スクリプトがバーチャルホスト上で実行されている場合は,そのバーチャルホスト名が設定されます)。
Apache 2では,UseCanonicalName
の設定に依存します。
UseCanonicalName = Off
の場合,ユーザーエージェントが送信する「Host:リクエストヘッダ」(サーバのホスト名)が設定されます。UseCanonicalName = On
の場合,Apacheの設定ファイルのServerName の設定値が使用されます。
SERVER_ADDR
PerlやPHPなど,現在のスクリプトが実行されているサーバのIPアドレスが設定されます。
SERVER_PORT
Webサーバの通信ポートとして使用されているポート番号が設定されます。