| Win32 FAQ |
perlwin32faq7 - Web プログラミング (CGI と PerlIS)
Perl for Win32を使ったWeb開発
HTTP (HyperText Transfer Protocol)とは、Webブラウザが Webサーバと会話するのに使うプロトコルです。HTTP規格の公式な仕様は、次のW3 コンソーシアムwebサーバで入手できます。:
http://www.w3.org/pub/WWW/Protocols/
ヤフーのHTTPページには、もっと読みやすい入門編があります。:
http://www.yahoo.com/Computers_and_Internet/Internet/World_Wide_Web/HTTP/
CGI (Common Gateway Interface) は、サーバプログラムを実行するために Webサーバが使うプロトコルです。CGIをサポートしているスクリプトはCGIスクリプトと呼ばれることがありますが、残念なことに、それが元でCGIそのものが言語であるという誤解が生じています。
CGIに関する古典的情報は、NCSA server で得られます。:
http://hoohoo.ncsa.uiuc.edu/cgi/
これを読んがことがない方は、直ちに読んでください。読んでもしっくり来ないようでしたら、次のヤフーCGIページをチェックするとよいでしょう。
http://www.yahoo.com/Computers_and_Internet/Internet/World_Wide_Web/CGI___Common_Gateway_Interface/
(これで1つのURL)
また、PerlによるCGIプログラミングについては、次のURLを読んでみてください。:
http://www.perl.com/CPAN-local/doc/FAQs/cgi/perl-cgi-faq.html
それでもよくわからない場合は、近所の書店で「CGIスクリプトを書いて成金になる(get-rich-quick-by-writing-CGI-scripts)」本を1冊読んでみるとよいでしょう。
UNIX と Win32プラットホームの大きな違いの一つは、Win32ではテキストまたはASCIIファイルとバイナリファイルの間に違いがあることです。 グラフィックファイルを出力ためには、ファイルがバイナリファイルであること、そして標準出力ストリームがバイナリデータを受け入れるように明示する必要があります。 以下を試してみてください。:
$MY_FILE_NAME = 'Penelope.jpg';
$CHUNK_SIZE = 4096;
open( MY_FILE, "<$MY_FILE_NAME" )
or die( "Can't open $MY_FILE_NAME: $!\n" );
print "Content-type: image/jpeg\r\n";
print "\r\n";
binmode( MY_FILE ); # これが大事!
binmode( STDOUT );
while ( $cb = read( MY_FILE, $data, $CHUNK_SIZE ) ) {
print $data;
}
close( MY_FILE );
Perl for ISAPIの初期のバージョンでは、出力ヘッダが正しく出力されていませんでした。 PerlISの初期バージョンの問題は、以下のようにスクリプトの最初にヘッダを送出することで解決できました。:
print <<"END";
HTTP/1.0 200 OK
Content-Type: text/html
END
現在ののバージョンのPerl for ISAPIは正しいヘッダを送出するようになっているので、上記の対策は必要ありません。
これを管理するレジストリ値はEnableCGIHeaderというREG_WORD値で、デフォルトでは1にセットされています。
この値は、レジストリキーHKEY_LOCAL_MACHINE\SOFTWARE\ActiveState\PerlISの下に納められています。
ヘッダの自動生成をオフにする必要が生じた場合は、この値を0にセットしてください。
Perl for ISAPIは環境変数PERLXSをセットします。
それで、スクリプトがPerl for ISAPIで実行されているかどうかわかります。
my $running_under_perlis = $ENV{PERLXS} eq 'PerlIS';
Perl for WebSiteは環境変数PERLXSをセットします。
それで、スクリプトがPerl for WebSiteで実行されているかどうかわかります。
my $running_under_perlws = $ENV{PERLXS} eq 'PerlWS';
CGI.pmモジュールがPerl for Win32で動作します。
これはPerl for Win32に含まれており、use CGIというステートメントをプログラムに加えることで使用可能になります。
CGIモジュールの完全なドキュメントがモジュールに埋め込まれており、perldoc CGIで読むことができます。以下に詳しいドキュメントがあります。:
http://www-genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
リダイレクトを使うと、通常ユーザにわからないように別のファイルやスクリプトをクライアントのブラウザに表示することができます。 CGIモジュールは、そのためにredirect()関数を用意しています。 次のコードは、クライアントのブラウザをhttp://www.perl.com, にリダイレクトするもので、CGIでもPerlISでも動作します。
use CGI qw(:standard);
print redirect('http://www.perl.com');
クッキーは、サイトからブラウザが立ち去った後もその情報を保持しておくために、サーバがブラウザなどのクライアントに渡すことができるデータの塊です。 これは、ユーザの好みを蓄積したり、次にやり取りする時にそのクライアントを識別するために使用されます。 クッキーは当初Netscape社で定義されました。というわけで、クッキーの定義は以下にあります。:
http://home.netscape.com/newsref/std/cookie_spec.html
CGIモジュールはクッキーの管理をサポートしています。 オンラインドキュメントの在処などCGIモジュールの詳細は、 Perl for Win32で動作するCGIモジュールにはどのようなものがありますか?を参照してください。
ユーザに断りなくEメールアドレスを入手するのは、通常不可能です。 Eメールアドレスが必要な場合は、ユーザにアドレスを記入してもらうためのフォームを用意します。
HTTP仕様書(see HTTPとは何ですか? その情報はどこにありますか?)参照)は、HTTPリクエストヘッダフィールド"From"を定義しています。 これには接続してきたユーザーのEメールアドレスを含めることができ、 スクリプトで環境変数 HTTP_FROMを使えばその内容を取り出すこともできます。 しかし、これはめったに提供されないのであまり当てにはできません。
リクエストがどこから来たかをこっそり特定するやり方には、接続に使われる IPアドレスをチェックする等いろいろな方法があります。しかし、この方法ではユーザのEメールアドレスを知ることはできません。
一般に、本人に知られずEメールアドレスを取得するのは、ユーザのプライバシーの侵害と考えられています。おそらくそれが非常に難しくなっている理由でしょう。
Web上には数多くのCGIスクリプトアーカイブがあります。あなたが望んでいるそのものは見つけられないかもしれませんが、ニーズに適うものは見つけられるでしょう。
よく知られたスクリプトページ:
Selena Sol's Script Archive: http://www.extropia.com/Scripts/
但し、スクリプトアーカイブの大半はUNIXをターゲットにしたスクリプトです。 それらを実行するにはいくらか改造しなければならないかもしれません。(see UNIXベースのスクリプトを動くようにするにはどうすればよいのでしょうか?)
これは、Perl-Win32-Usersメーリングリストでもっとも多い質問の一つです。それはよく次のように表現されています:「プログラムを書かなければなりません。これがその仕様です。どうか金曜日までにEメールで私に送って下さい」。 このメッセージにもし回答があった場合、通常その回答は荒々しいものになるでしょう。その理由は理解して頂けると思います。
難しい方法としては、Webサーバのような環境変数と標準入力ストリームをセットして、コマンドラインからCGIプログラムをテストする方法があります。(この詳細はCGI 1.1 規格仕様書を参照 -- CGIとは何ですか。 詳細な情報を入手するにはどうすればよいのでしょうか? )
簡単な方法としては、CGI.pmを使う方法があります。 CGI.pmはCGIプログラミング用の Perlモジュールで、コマンドライン引数と一緒にCGIプログラムを実行する簡単な仕組みを提供しています。
Perl for Win32で動作するCGIモジュールにはどのようなものがありますか?参照。
IIS Webサーバ上で、HTTPステータスラインを出力しない、かなり古いバージョンのPerl for ISAPIをPerlインタプリタとして使っている場合、このような現象が生じます。 詳細は、 Perl for ISAPIのもとではCGIスクリプトがうまく動かないようです。 を参照してください。
Webサーバの設定に誤りがあります。Webサーバは、Perlプログラムが実行すべきものであると知らないので、Perlプログラムをそのままブラウザに返そうとしているのです。Perlスクリプトは実行すべきものであるとWebサーバに知らしめる設定方法については、 perlwin32faq6 manpage を参照して下さい。
Perl for WSAPI、及びその短縮形のPerlWSとは、 O'Reilly社のWebSite Professional web serverのユーザにPerl for ISAPIとオナ直納を提供するものです。
この FAQ は、元々Evangelo Prodromou evangelo@endcontsw.comが作成し、保守していたものです。 現在、この文書は、O'Reilly社のBrian Jepson及びActiveState社のDavid GroveとDavid Dmytryshynが改訂・更新しています。
このFAQはパブリックドメインですが、使用する場合はオリジナルの作者について明示してください。
| Win32 FAQ |