Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

環境変数の研究

研究内容

アクセス解析の基本、環境変数とその値について研究します。

詳細

CGIプログラムが受け取れる情報

アクセス解析っていうものがありますが、 CGIプログラムはどんな情報を受け取れるのでしょうか。 その鍵は環境変数にあります。 ウェブサーバーは、CGIプログラムを起動するときに、 いくつかの情報を環境変数に入れてCGIプログラムに渡してくれます。 フォームからの情報を得るときも、環境変数を使いました。 環境変数は、Perlでは連想配列 %ENV に入っているんでした。 どんな情報が入っているのか、研究してみましょう。

結果

環境変数にはどんなものがあるんでしょう

フォームからの情報受信のときに、REQUEST_METHOD とか QUERY_STRING といった名前の 環境変数を取得していろいろ処理しました。これ以外にも環境変数にはいろいろ あると思いますが、どんなものがあるんでしょうか? 本などで調べれば載っていますが、ここではCGIプログラム自身に、 どんな環境変数があるのか列挙させてみようと思います。

連想配列のキーを列挙する

環境変数は連想配列 %ENV なんでした。 環境変数名はこの連想配列のキーになっていました。 ということは、連想配列 %ENV のキーを全て列挙したら、 それが全ての環境変数のリストになるわけです。

連想配列のキーを列挙するというのはどうやったらいいのでしょう。 もちろん、Perlにはそのための便利な機能があるんです。 連想配列のキーを配列にして返す、keys という関数です。 次のように使います。

@配列 = keys %連想配列;

こうやって、配列が得られたならその中身を列挙するのは簡単です。 もう忘れかけていますが、全ての配列の要素にアクセスするには、 foreach というものを使うんでした。

foreach $tmp (@配列)
{
	$tmpに要素の値が入っているので、処理する
}

そうそう、デフォルト引数 $_ っていうのがありましたね。 こういう繰り返し文は、大抵の場合、このデフォルト引数を利用して 処理を簡単にできます。

foreach (@配列)
{
	$_ に要素の値が入っているので、処理する
}

今回は、環境変数名を画面に表示するだけですから、print文一発で目的達成です。

作成したCGIプログラム

printenvname.cgi
#!/usr/bin/perl

print "Content-type: text/html\n";
print "\n";

foreach (keys(%ENV)) {
    print "$_<br>\n";
}

実行結果

次のリンクをクリックしてみてください。 環境変数名の一覧を表示します。

環境変数名の一覧を表示

考察

表示されました

ばっちり表示されましたね。 でもちょっとみにくいですね。 勉強をかねて、アルファベット順に並べ替えて、番号を付けて表示してみましょう!

結果

アルファベット順にする

アルファベット順にする、並び替えるっていうのを、ソートっていいます。 これまたPerlには、一発で配列のソートをしてくれる関数 sort がありますので これを利用しましょう!sort は、ソートした配列を返します。

番号を付け等幅フォントにする

これは、HTMLタグでやりましょうか。

作成したCGIプログラム

printenvname2.cgi
#!/usr/bin/perl

print "Content-type: text/html\n";
print "\n";

print "<tt>";
print "<ol>";
foreach (sort(keys(%ENV))) {
    print "<li>$_";
}
print "</ol>";
print "</tt>";

実行結果

次のリンクをクリックしてみてください。 環境変数名の一覧を表示します。

環境変数名の一覧をソートして表示

考察

できました

だいぶ見やすくなりました。…これが環境変数の一覧です。

本当は、キー(環境変数名)だけじゃなくて、その値も表示したかったんですが、 これらの情報の中には、一般の人にはあんまり見られたくない情報があるんで、 キーを表示するだけにしました。 サーバーのバージョンとか、サーバー内のスクリプトのパスとか、見られてもどうってことは ないと思うんですが、もしかしてセキュリティのこととか考えると良くないのかなと思いまして。 ご容赦ください。値も一緒に表示するにはどうしたらいいのかっていうのは、 難しくないですよね。print "$_ = $ENV{$_}"; とかでOKです。

訪問者の情報を表す環境変数は

さて、これら環境変数、サーバーの情報だけでなく、 アクセスしてきた訪問者(クライアント)の情報が混ざっています。 アクセス解析は、環境変数から取得できる、訪問者の情報を元にして行うんですね! ですから、環境変数にどんな訪問者の情報が入っているのかで、アクセス解析でできることって いうのが決まります。

訪問者の情報が入っている環境変数には、次のものがあります。


環境変数名通称データの意味
1.HTTP_ACCEPT_LANGUAGE
言語設定
2.HTTP_REFERERリファラリンク元ページのURLが入ってます。
3.HTTP_USER_AGENTユーザーエージェントOSやブラウザの情報が入ってます。
4.REMOTE_ADDRリモートアドレスIPアドレスのこと。
5.REMOTE_PORTポート番号クライアントマシンが通信に使っているポート番号。

CGIプログラムが受け取れる訪問者の情報は、これだけです。 …こうやって書くと誤解されるかな? 自前で、クッキーを使って、訪問回数とか、前回の訪問時刻とか、そういったものを 管理したり、登録型のサイトのように、ID/パスワードを発行して、情報をデータベースに 保存しておくみたいなことはできますけど、そういったものを除いて、 CGIプログラムが何もせずに受け取れる訪問者の情報としては、これで全部です。 そして、CGIプログラムによって、これらの情報を使って、よりよいホームページ作りができる…のかな?

CGIプログラムが訪問者のどんな情報を取得できるのか。 それが今回の研究の本題でした。これから、その辺を詳しく研究していきます。 とりあえず今回の研究は、環境変数というものをあらためて見直してみたっていうことと、 その中で訪問者の情報を表しているのがどれなのかっていうことを確認しました。 これら訪問者の情報に手を加えると、得られる情報がよりはっきりしてきます。 1つ1つ研究していきましょう。続きはまた。

参考

環境変数の値も表示させるには、次のソースを参考にして下さい。

#!/usr/bin/perl

print "Content-type: text/html\n";
print "\n";

print "<tt>";
print "<ol>";
foreach (sort(keys(%ENV))) {
    print "<li>$_ = $ENV{$_}";
}
print "</ol>";
print "</tt>";

分かったこと

  1. 連想配列のキーの一覧を得るには keys 関数。キーの配列が得られます。
  2. 配列をソートするには sort 関数。ソートされた配列が得られます。
  3. 配列の全ての要素に1つずつアクセスするには foreach 文でした。
  4. 環境変数のうち、クライアントの情報はアクセス解析などに利用できます。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。