3部 CGI リファレンス

環境変数を利用して情報を取得

ウェブサーバはクライアント、サーバ、ユーザなどに関する情報を『CGI 環境変数』として持っています。 CGIプログラムはこの環境変数を使ってさまざまな情報を取得し、利用することができます。

1.環境変数の概要

 次の表はCGIで利用可能な環境変数のリストです。

ウェブサーバ情報に関する環境変数リスト
名称 解説

GATEWAY_INTERFACE
サーバが使用するCGIのレビジョン情報

[書式] CGI/レビジョン

SERVER_ADMIN ウェブサーバの管理者のメールアドレス情報
SERVER_NAME サーバのホスト名、ドメイン名、またはIPアドレス情報
SERVER_PORT リクエスト送信に使われたポート番号
SERVER_PROTOCOL リクエスト送信に使われたプロトコルの名前とレビジョン情報

[書式] protocol/revision

SERVER_SOFTWARE  CGI プログラム を起動したサーバソフトウエアの名前とバージョン情報

[書式] name/version

CGI環境の情報に関する環境変数のリスト
名称 解説
CONTENT_LENGTH POSTから標準入力に送信されたデータのバイト数
CONTENT_TYPE POSTとPUTなどのクエリに添付されたデータのMIMEタイプ

[書式] text/html...

DOCUMENT_ROOT HTML関連ファイルを設置するルートディレクトリ(たとえば /var/www/htdocs )
PATH UNIXコマンドを起動するディレクトリ
PATH_ INFO クライアントから送られるエキストラパス情報
PATH_TRANSLATED ウェブサーバのドキュメントルートに環境変数
PATH_INFO を追加した情報
QUERY_STRING クエリとして送られたURL情報のクエスチョン( ?
)以降の情報

データは『URLエンコード』されています。

REQUEST_METHOD リクエストを送信した方法(メソッド)

GETやPOSTなどの情報です。

SCRIPT_FILENAME CGI プログラムのファイル名も含めた絶対パス情報。

[例] /home/httpd/cgi-bin/script.cgi

SCRIPT_NAME CGI プログラムのルートディレクトリ以降のパス情報

[例] /cgi-bin/script.cgi

クライアントに関する環境変数のリスト
名称 解説
AUTH_TYPE ユーザを認証するときに使用する認証メソッド

ウェブサーバとリモートホストがIDENTD認証デーモン(ユーザ認証プロトコル)を実行しているときだけ値があります。

PATH_TRANSLATED CGIプログラムに渡されるエキストラパス情報
HTTP_FROM リクエストを出しているユーザの電子メールアドレス

ほとんどのブラウザでは、この変数をサポートしていません。

HTTP_ACCEPT クライアントが受け付けることができるMIMEタイプのリスト
HTTP_USER_AGENT クライアントがリクエストを発行するときに使用するブラウザ名
HTTP_REFERER 呼び出し元のURL。

アドレスバーからの直接入力、ブックマークからのアクセスの際には値がありません。

REMOTE_ADDR リモートホストのIPアドレス情報
REMOTE_HOST リモートホストのドメイン名
REMOTE_IDENT リモートホストのユーザ名
REMOTE_USER ユーザの認証名

ウェブサーバとリモートホストがIDENTD認証デーモン(ユーザ認証プロトコル)を実行しているときだけ値があります。

環境変数を表示

サーバに関する様々な情報、例えばサーバソフトウエアの名前や、使用しているCGIやHTTPのリビジョンなどを表示する簡単なプログアムは以下のとおりです。

環境変数の全出力
#!/usr/local/bin/perl
print "Content-type: text/html", "\n\n";
print "<HTML><BODY>", "\n";
print "<H1>環境変数</H1><HR>", "\n";
foreach my $key( keys %ENV ){
	print "$key: $ENV{$key}<BR>", "\n";
}
print "<HR>", "\n";
print "</BODY></HTML>", "\n";
表示結果

SERVER_SOFTWARE:
Apache/1.3.9 (Unix)
GATEWAY_INTERFACE: CGI/1.1
DOCUMENT_ROOT: /home/httpd/html
REMOTE_ADDR: 000.000.000.000
SERVER_PROTOCOL: HTTP/1.1
SERVER_SIGNATURE:
Apache/1.3.9 Server at www.domain.com Port 80

REQUEST_METHOD: GET
QUERY_STRING:
HTTP_USER_AGENT: Mozilla/4.0 (compatible; MSIE 5.5;
Windows 98; Win 9x 4.90)
PATH: /sbin:/usr/sbin:/bin:/usr/bin
HTTP_ACCEPT: image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, application/vnd.ms-excel, application/msword,
*/*
HTTP_CONNECTION: Keep-Alive
REMOTE_PORT: 1345
SERVER_ADDR: 000.000.000.000
HTTP_ACCEPT_LANGUAGE: ja
SCRIPT_NAME: /cgi-bin/rhythm/test2.cgi
HTTP_ACCEPT_ENCODING: gzip, deflate
SCRIPT_FILENAME: /home/httpd/cgi-bin/rhythm/test2.cgi
SERVER_NAME: www.domain.com
REQUEST_URI: /cgi-bin/rhythm/test2.cgi
SERVER_PORT: 80
HTTP_HOST: www.domain.com
SERVER_ADMIN: admin@www.domain.com

PAGE TOP


2.環境変数を利用したプログラム例

環境変数を利用した便利なプログラムサンプルをいくつか紹介します。まだ説明していないさまざまな命令文を使っていますが、環境変数を利用してどのようなことができるかを把握しておきましょう。


クライアントブラウザのチェック

クライアントの使用するブラウザによって、サポートしているHTMLタグや情報のタイプが異なります。ブラウザタイプをチェックして、ブラウザの種類を表示するプログラムを作ってみましょう。

ブラウザ名は HTTP_USER_AGENT 環境変数に入っています。

my $agent = $ENV{'HTTP_USER_AGENT'};

ネットスケープとインターネット・エクスプローラはどちらもHTTP_USER_AGENT変数の先頭に「Mozilla」という文字列があります。エクスプローラの場合はそのあとに必ず「compatible; MSIE」という文字列があるので、これでネットスケープとエクスプローラの区別をつけることができます。

IEとNNでCGIの処理を変える
#!/usr/local/bin/perl
print "Content-type: text/html", "\n\n";
# HTTP_USER_AGENTの値を代入
my $agent = $ENV{'HTTP_USER_AGENT'};
print $agent,"<br>\n";
if ( $agent =~ /^Mozilla/ ){
	# エクスプローラの場合
	if ( $agent =~ /^Mozilla\/[0-9\.]+\s\(compatible\; MSIE/ ){
		print "IE<br>\n";
	# ネットスケープの場合
	} else {
		print "NN<br>\n";
	}
# その他のブラウザの場合
} else {
	print "OTHER<br>\n";
}

指定ドメインに対するアクセス制限

環境変数REMOTE_HOSTを使って、指定したドメインからのアクセスと、それ以外のアクセスによって処理を分けることができます。

アクセスもとのドメインを調べる
#!/usr/local/bin/perl
print "Content-type: text/html", "\n\n";
# アクセス許可するドメインを設定
my $host_address = 'rfs\.co\.jp';
# 指定したドメインと環境変数REMOTE_HOSTの値を比べる
if ( $ENV{'REMOTE_HOST'} =~ /^\.$host_address$/ ){
	# アクセス成功
	print "Success in login\n";
} else {
	# アクセス失敗
	print "Failure of login\n";
}

エキストラパス情報

クエリー情報をCGIスクリプトに渡すだけでなく、エキストラパス情報として知らされている付加データを、URLの一部として渡すことも可能です。以下に、エキストラパス情報を持つスクリプトをどのようにして呼び出すかを示します。

http://www.***.jp/cgi-bin/expath.cgi/readme.txt

環境変数PATH_INFOの値には「/readme.txt」が、環境変数PATH_TRANSLATEDには、(たとえばドキュメント・ルート・ディレクトリが「/home/httpd/html」の場合)「/home/httpd/html/readme.txt」が格納されます。

コマンドのパスを調べる

環境変数 PATH の値を使えば、OSコマンドのインストールディレクトリを調べることができます。たとえば、「perl」インタプリタのインストールディレクトリをすべて出力する場合は下記のようにします。

コマンドのインストールディレクトリを調べる
#!/usr/local/bin/perl
print "Content-type: text/html", "\n\n";
$command = "perl";
foreach my $key( split(/:/, $ENV{'PATH'}) ){
	$key =~ '.' if $key eq '';
	if ( -f "$key/$command" and -x _){
		print "$command was in $key\n";
	}
}

参考資料

関連記事