%ENV で HTTP リクエストの情報を調べる

特殊変数 %ENV には、スクリプトが動作しているコンピュータの「環境変数」が入っています。環境変数とは、OS の内部の設定などを設定/記録する為の変数で「名前=値」の組が集まっているものです。環境変数を調べる事でシステムの設定や情報を調べる事ができます。
%ENV の内容を調べるために、以下のスクリプトを実行してみました。

use strict;

while (my ($key, $value) = each %ENV) {
    print "$key=$value\n";
}

palmo の環境での実行結果は以下のようになりました。一部省略しています。

HOMEDRIVE=C:
CLIENTNAME=Console
COMMONPROGRAMFILES=C:\Program Files\Common Files
PROGRAMFILES=C:\Program Files
OS=Windows_NT
(中略)
TEMP=C:\DOCUME~1\palmo\LOCALS~1\Temp
PROCESSOR_REVISION=2701
SYSTEMDRIVE=C:
SYSTEMROOT=C:\WINDOWS
COMSPEC=C:\WINDOWS\system32\cmd.exe

環境変数を調べれば、システムで使われるファイルやフォルダ(ディレクトリ)のパスを調べたり、OS のバージョンを調べる事ができますね。(^_^)


CGI プログラムとして動かした場合、%ENV には環境変数に加えて「HTTP リクエスト」に関する情報も入っています。サイトの利用者が、ページを取得するためにサーバーに送ってくる要求を「リクエスト」と呼びますが、リクエストには「ヘッダー」と呼ばれる「名前: 値」形式のパラメータが付属しています。
例えば Mozilla Firefox 1.5 でこの「ぱるも日記」のトップページ http://d.hatena.ne.jp/palmo/ を要求する際の HTTP リクエストは、以下のようになります。(LiveHTTPHeaders エクステンションを利用しました)

GET /palmo/ HTTP/1.1
Host: d.hatena.ne.jp
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

%ENV には、この「ヘッダー」が入っています。各パラメータの名前には、頭に「HTTP_」が付き、全て大文字になって、「-」(ハイフン)が「_」(アンダーバー)に置き換えられた名前が使われます。例えば、上の「User-Agent」の値は $ENV{'HTTP_USER_AGENT'} に入っています。
また、リクエストの一番最初の行の情報は、頭に「REQUEST_」がついた名前で表されています。サーバーに要求する操作(メソッド)を表す「GET」は $ENV{'REQUEST_METHOD'} に、要求されているページのアドレス「/palmo/」は $ENV{'REQUEST_URI'} に入っています。
他にも、%ENV には CGI スクリプト自身のパスを表す SCRIPT_NAME や、サーバーに関する情報など、CGI の処理に便利な情報が入っています。


確認の為に %ENV の内容を表示する CGI を作りました。

#!/usr/local/bin/perl
use strict;

my $rows = "";
for my $key (sort keys %ENV) {
    $rows .= "<tr><th>$key</th><td>$ENV{$key}</td></tr>\n";
}

print <<HTML;
Content-Type: text/html

<html>
<head><title>ENV Values</title></head>
<style type="text/css">
th, td { font-size: 90%; padding: 0.2em 0.5em; border-bottom: 1px #C00 solid; }
th { text-align: left; background-color: #FCC; border-right: 1px #C00 solid; }
</style>
<body>
<table>$rows</table>
</body>
</html>
HTML

__END__

実行結果は下のページで見ることができます。
envtitle.cgi 実行結果
リクエストヘッダーやサーバーの情報などが確認できるはずです。普段は目に見えませんが、色々な情報が送られているんですね。(^_^)