このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

Perlの環境変数

発言者:奥田
( Date Tuesday, October 12, 1999 19:13:24 )


Perlの超初心者です。ついでにサーバーも超初心者です。

Mac (G3 400)でサーバーを立ち上げました。

ASIP 6.2
Quick DNS Pro 2.2.1J

を使って1台でWEBx2,Mail,DNSと立ち上げました。
最近欲を出して,Webのアクセスカウンターに挑戦中です。

Perl 5.2をインストールし,以前UNIXマシーンで動かしていたカウンターと
ログを同時に取るcgiをMac用に移植して使用しています。cgiは動いており
アクセスするとカウンターも動くしログも取っています(なんか遅いですが)。

しかし,ログのアドレス欄に負の数字が入っています。

1999/10/08 Fri 11:17:41 -2062072795 Netscape/4.6 [en] (Win98; I)
1999/10/08 Fri 11:33:10 -2062072799 Netscape/4.5 (Macintosh; I; PPC)
1999/10/08 Fri 11:33:17 -2062072799 Netscape/4.5 (Macintosh; I; PPC)

問題の部分のプログラムは以下の通りです。

$rh = $ENV{'REMOTE_HOST'};
if ($rh eq "") {
  $rh = $ENV{'REMOTE_ADDR'};
}

$ua = $ENV{'HTTP_USER_AGENT'};
$ua =~ s/Mozilla/Netscape/g;

if (-e $log_file) {
  open(LG,">> $log_file");
  print LG "$date $rh $ua\n";
  close(LG);
}
ページを公開していないのでドメイン外からのアクセスについては分か
りませんが,ASIPのログはIPアドレスまで出しているので,Perlの$rh
の情報がちゃんと取れていないようです。REMOTE_HOSTとかREMOTE_ADDR
はMacでは使えないのでしょうか?それとも以前の書き込みに見られた
QuickDNS Proのドメイン内の問題で,これが正常ですか?

以上,私には手に負えずトホホ状態です。
どなたか知恵を貸していただけませんか?

usui , seiichi さんからのコメント
( Tuesday, October 12, 1999 21:02:18 )

ASIPについては詳しい方がフォローしてくれると思いますので、
CGIに次のような文をつけてみてはいかがでしょうか?

foreach $key (keys %ENV){
print "$key -----> $ENV{$key} \n";
}

奥田 さんからのコメント
( Wednesday, October 13, 1999 14:39:10 )

usui_seiichiさん,ありがとうございます。
早速,どんな環境変数があるか書き出させてみました。
SERVER_SOFTWARE -----> MacHTTP/2.0
GATEWAY_INTERFACE -----> CGI/1.1
MACPERL -----> MacintoshHD:アプリケーション:MacPerl ト:
REMOTE_ADDR -----> -2162072795
SERVER_PROTOCOL -----> HTTP/1.0
REQUEST_METHOD -----> GET
HTTP_REFERER -----> http://www.aaa.bbb.co.jp/aaa.html
HTTP_USER_AGENT -----> Mozilla/4.6 [en] (Win98; I)
HTTP_ACCEPT -----> image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png
HTTP_CONNECTION -----> Keep-Alive
TMPDIR -----> MacintoshHD:Temporary Items:
HTTP_ACCEPT_LANGUAGE -----> ja
HTTP_ACCEPT_ENCODING -----> gzip
SCRIPT_NAME -----> /xxx.cgi
HTTP_PRAGMA -----> no-cache
SERVER_NAME -----> www.aaa.bbb.co.jp.
HTTP_ACCEPT_CHARSET -----> iso-8859-1,*,utf-8
SERVER_PORT -----> 80
HTTP_HOST -----> www.aaa.bbb.co.jp
PERL5LIB -----> 
USER -----> UserName
となりました。

REMOTE_HOSTという環境変数は見あたりません。
また,REMOTE_ADDRはやはり負の値を引き出しています。
うーん,どう解釈するのでしょうか?

usui , seiichi さんからのコメント
( Monday, October 18, 1999 21:42:57 )

コメントがつかないようですね、
私はASIPを使っていませんのでフォローすることができません。

Perlということで読んでいない方もいるかと思いますので、
ASIPを中心とした内容で再度投稿されることをお勧めします。

奥田 さんからのコメント
( Wednesday, October 20, 1999 09:56:14 )

usui-さん
お心遣い,ありがとうございます。

正直お手上げ状態です。どうやらサブドメイン外からのアクセスについて
も,おかしいようです。しかし,ログ程度なら,Perlを無理に使う必要が
ないので,Analogを導入して,ASIPのログを整理しようかとも考えており
ます。CGIをあまり入れたくもありませんし。

もう少し勉強する必要がありそうです。

寺港みやび さんからのコメント
( Sunday, June 04, 2000 19:21:42 )

ちょっと古いスレッドですがMacPerlで
知恵がまわらなくて、知識がおぼつかなくて
わからない事があります。

SSIでCGIを呼び出した場合、SSIの組み込まれた
ページのPATH(かURI)を取得するには
どうすればいいかお解りになる方いらっしゃいますか?

http://www.aaaa.aaa/bbbb.htm からSSIで
http://www.aaaa.aaa/cgi-bin/zzz.cgiをコールした場合
CGIのログにhttp://www.aaaa.aaa/bbbb.htmを記録したいのです。

MacPerlだと環境変数からはPATH_INFOが使えないし
PATH_TRANSLATEDなんてものもないみたいだし・・・

田中求之 さんからのコメント
( Sunday, June 04, 2000 22:16:19 )

>MacPerlだと環境変数からはPATH_INFOが使えないし

そうなんでしたっけ? MacOS のサーバでは PATH_INFO は URL の $ 以降
を指すんですが、これはちゃんと MacPerl にも渡されるのではありません
でしたっけ?

寺港みやび さんからのコメント
( Monday, June 05, 2000 14:04:43 )

すいません、言葉たらずでした。

× MacPerlだと環境変数からはPATH_INFOが使えないし

○ MacPerlだとPATH_INFOは$以降になってしまうし

でした。

SSIで呼び出すCGIはどのページも同じにしたいんです。
<!--#exec script="/cgi-bin/zzz.cgi">
これを
<!--#exec script="/cgi-bin/zzz.cgi$aaaa">とすれば
aaaaから起動されたとわかるんですが
もう沢山のページに組み込んでしまったSSIコマンドなので
それを全部変更するのは骨が折れるという事で
<!--#exec script="/cgi-bin/zzz.cgi">だけで
どこのページで動かされたらを記録したいんです。


↑×2の例を
UNIXだとPATH_INFOには/bbbb.htmと入りますが
MacPerlだとおっしゃるように$以下となるために
なにも入らないんです。
(よく考えて書いているついもりでもかなり主観的になってしまうなあ>反省)

田中求之 さんからのコメント
( Monday, June 05, 2000 14:32:14 )

なるほど、そういうことでしたか。確かに面倒ですよね。
ただ、SSI がどのような情報を CGI に渡して呼びだすかというのは
SSI の実装次第だと思います。ですから、

>UNIXだとPATH_INFOには/bbbb.htmと入りますが

ということですが、これは UNIX の CGI ではなく、SSI の方の実装
の問題ではないかなと思うのですが(まぁ、どっちにせよ、Mac では
情報が取れないってことかな?)

お使いの Web サーバは何ですか?

寺港みやび さんからのコメント
( Monday, June 05, 2000 16:53:15 )

Webサーバーは、WebStar3です。

SSIのエコーコマンドではDOCUMENT_URIなどで
どのページなのかが表示できるんですが
MacPerlで
$ENV{'DOCUMENT_URI'}や$ENV{'DOCUMENT_NAME'}としても
中味はからっぽのようなのです。
環境変数の取得方法が間違っているのでしょうか・・・。

よしもと さんからのコメント
( Monday, June 05, 2000 19:24:30 )

>環境変数の取得方法が間違っているのでしょうか・・・。

えっと、もう暫くソースを見ていないからアレでですが、多分そんな変数は定義されていないのだと思います、MacPerl CGIの方で...

その辺りを自分で定義してやってmakeすれば使えるようになりますけど...

よしもと さんからのコメント
( Monday, June 05, 2000 19:52:24 )

>多分そんな変数は定義されていないのだと思います

久々にソースを見てみました。やはり定義されていないです。
ということで、自分でMPCGI.cを変更してmakeするか、作者に頼むか、どなたかに作ってもらうか...まあ、色々手はあるかな? :-)

寺港みやび さんからのコメント
( Monday, June 05, 2000 20:28:52 )

ですよねえ。
↑×11で紹介されているスクリプトを
動かしてみても
↑×10と同じ(変数の種類)でした。

MPCGI.cの変更はとても荷が重いです(T_T)

MacPerl標準の方法(^^;)でなにか
方法をご存じの方いらっしゃれば
ご紹介くださいませ。m(__)m

よしもと さんからのコメント
( Monday, June 05, 2000 22:39:36 )

>MPCGI.cの変更はとても荷が重いです(T_T)

簡単よ。こーどうぉーりゃいりますが (^^;

>MacPerl標準の方法(^^;)でなにか
>方法をご存じの方いらっしゃれば
>ご紹介くださいませ。m(__)m

えっと、使ってないからもう忘れちゃったけど(; ;)ホロホロ
要はAppleEventを使ってMacPerlからその変数を読んでやれば良いのと違う?
普通のPerlじゃ出来ないけど、MacPerlならできるはず...>やってみよう


寺港みやび さんからのコメント
( Tuesday, June 06, 2000 13:18:06 )

>簡単よ。こーどうぉーりゃいりますが (^^;
簡単ですか? そうなのかあ。まあ言葉はしゃべれるようになれば簡単なものかもしれないですね("_";)

>要はAppleEventを使ってMacPerlからその変数を読んでやれば良いのと違う?
そういう事になるんですね。
MacPerlからAppleEventとお話しができれば
色々と楽しくなりそう。

>普通のPerlじゃ出来ないけど、MacPerlならできるはず...>やってみよう
MacPerl愛用者としては意味もなく喜んでしまう表現です(^-^)
やってみます(小声で)

よしもと さんからのコメント
( Wednesday, June 07, 2000 01:54:02 )

>簡単ですか?
えっと、昔は簡単だったと思ったんだけどぉ....今は...
MacPerlをmakeするなら昔のCWがいるからなぁ。またCD引っ張り出してきて、インストールして...う〜ん、今は難しいかもしれません(笑)

>MacPerlからAppleEventとお話しができれば
>色々と楽しくなりそう。
楽しい?うん、楽しいかも、いや、きっと、絶対、....

>MacPerl愛用者としては意味もなく喜んでしまう表現です(^-^)
もう、すっかりMacPerlの愛好者でなくなってしまった私は、是非とも
頑張って戴きたいと思う所存であります。

>やってみます(小声で)
これが出来るとW*で拡張されている変数も扱えるので非常に嬉しかったりします。
(以前非常に嬉しかった記憶がありますから...)

つうことで、結果報告よろしくね!! (^^;