ウェブサーバはクライアント、サーバ、ユーザなどに関する情報を『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
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";
}
}
参考資料
- MIME既定 RFC1521【英】
- MIME Type 一覧【英】