CGI講座 ≫ 環境変数
環境変数って何?
クライアントがCGIを呼び出したした時、サーバは各種の環境変数を設定します。
環境変数はクライアントがサーバにリクエストした際の情報に基づくものや、サーバ自身の情報があります。
この環境変数の値をCGIの中で取り出すことができます。
注意しなければならないことは、環境変数の一部はクライアントが勝手に設定することができるので、正確な値が渡ってこない場合があるということです。
環境変数の取り方
Perlの場合
Perlで環境変数は%ENVというハッシュ変数に格納されているので、これを参照します。
print "Content-type: text/html\n\n";
foreach my $key (keys %ENV) {
print "<B>$key</B>:$ENV{$key}<BR>\n";
}
このCGIを実行してみて下さい。(一行目のパスは省略してます。)
ずら~~~っと何やら出てきたと思いますが、太字の部分が環境変数名です。
その値とセットで表示しています。
PHPの場合
PHPで環境変数は$_SERVERというハッシュ変数に格納されているので、これを参照します。
<?php
foreach($_SERVER as $key => $value) {
echo "<b>$key</b>:$value<br>\n";
}
?>
主な環境変数一覧
主な環境変数を説明します。
●REMOTE_ADDR
アクセス元のIPアドレス。
●REMOTE_HOST
アクセス元のホスト名。IPアドレスが入ってくるサーバあります。
その場合は自分で変換します。
Perlの場合: $host = gethostbyaddr(pack("C4",split(/\./,$ENV{'REMOTE_ADDR'})),2); PHPの場合: $host = gethostbyaddr($_SERVER{'REMOTE_ADDR'});
ってな具合に変換できます。
●REMOTE_USER
認証が行われた時に設定される。
●HTTP_REFERER
CGIの参照元のURLが格納されます。
要するに、CGIを呼び出したURLです。
が、環境によって入ってくる値はバラバラです。(ブックマークの時が良い例)
●HTTP_USER_AGENT
ブラウザの名前・バージョン名が格納される。
Mozilla/5.0 (Windows NT 6.0; rv:52.0) Gecko/20100101 Firefox/52.0
ここまでの情報はアクセスログを取るのによく使われます。
●REQUEST_METHOD
データの通信方式です。CGIの場合、POSTかGET。
HTML講座のフォームの所を参照して下さい。
●PATH_INFO
CGIの引数(CGIを呼び出すとき、CGI名の後ろにつけた文字列)です。
http://xxxx.aaa.com/cgi-bin/test.cgi/aaa
と指定した時に、CGI名の後の文字列(”/aaa”)を取ります。
●REQUEST_URI
URLのドキュメントルートからの表示。
http://xxxx.aaa.com/cgi-bin/test.cgi
この時、”/cgi-bin/test.cgi”が入ります。
●PATH_TRANSLATED
PATH_INFOをフルパスにしたものです。
●SCRIPT_NAME
CGI名です。URLからサーバー名を省いたものになります。
●QUERY_STRING
GETメソッド形式で実行された場合、送られたデータが入ります。
http://xxxx.aaa.com/cgi-bin/test.cgi?v=aaa
GETの場合、このように引数を渡しますが、この時?から後の値「v=aaa」が入ります。
●CONTENT_TYPE
CGIがPOST形式で実行される場合に、”application/x-www-form-urlencoded”が入ります。
●CONTENT_LENGTH
CGIがPOST形式で実行される場合に、送られたデータの長さが入ります。
●SERVER_SOFTWARE
CGIを実行しているWWWサーバの種類です。
●SERVER_NAME
CGIを実行しているWWWサーバのホスト名もしくは、IPアドレスになります。
●GATEWAY_INTERFACE
WWWサーバの使用しているCGIのバージョンです。
●SERVER_PROTOCOL
HTTPのバージョンです。
●SERVER_PORT
使用しているport番号です。WWWは通常80を使用することになっています。
大体使えるのはこれぐらいです。あとは値と変数名を見れば大体何を示しているかわかるはずなので、自分で理解していってください。
個々の値を取るには、$ENV{'SERVER_PORT'}(PHPの場合$_SERVER['SERVER_PORT'])と指定します。
また、この環境変数は使用する環境(サーバ側・クライアント側)によって一定の値が取れなかったり、変数自体が存在しないこともあります。