PageID:IIS_CGI
Last update:00.3.2
Perl初心者の部屋

MS IIS/PWSでのCGI Q&A


野口孝昌さん訳、steveg@onramp.net 原著の 「The Microsoft IIS FAQの和訳」が下記URLで公開されています。 IISユーザは必読ですね。
http://www.t3.rim.or.jp/~nog/pcpage/iisj.html
最下部近くにCGI関連部分を一部引用させて頂いてます。

また、IIS関連の不具合関連、トラブルシューティング情報が下記URLで検索できます。
http://www.microsoft.com/search/worldwide/japan/support/default.asp

iis関連記事のみを抜粋

●参考サイト
お薦めのサイトがあれば教えてください。

・Answers to Microsoft Webserver Problems [ http://www.geocities.com/SiliconValley/Park/8312/perlis.htm(英文)


Q1. よく分からないのですが、IISではCGIは、なにも設定せず、動きました。 /cgi-bin/等何か、設定する必要があるのでしょうか?

Q2. NTPerlを使いたいのですが、コマンドプロンプトからは動くのに、URLからは、

CGIエラー 
指定せれたCGIアプリケーションは、HTTPヘッダーを 一部しか返していません。
返させたヘッダーは:

という状態になってしまいます。

callするCGI
@ECHO OFF
C:\IIS\scripts\perl\perl.exe C:\IIS\scripts\test.pl

test.plは、
print "Content-type: text/plain\n\n";
print "test";
です。

Q3.マニュアルか何かの文献において、Perlプログラムの 呼び出しは、例えば http://xxx.xxx.xxx/cgi-bin/xxx.pl? の様に行うとありました。 そこで、IE3.0でこの様なリンクを張ると正常に動作するのですが Netscapeで同じことをすると呼び出せません。

Q4.今回perlでCGIスクリプトを作成しましたが、 簡単なものでさえ上手くいきません。何故かファイルのセーブを行ってしまいます。 コマンドラインからはうまくいっています。

Q5.IISで関連付けを.pl=perlIS.dllとすると、ネットスケープの ブラウザではうまく出力できまくなりました。 何かおかしいのでしょうか。

Q6.perl を使用し form から受けたデータを パイプ経由でmail で送信しようとしているのですが、うまくいきません。 どうしてでしょうか。

環境: WindowsNTserver 4.0 IIS 2.0 Perl v5.001 build 110 ANT sendmail with pop3 1.1

Q7. マイクロソフトのIISでSSIをやろうとしているのですが、 全然機能しません。どうしてでしょうか?

Q8. WindowsNT Workstation+PWSでWWWを構築しているのですが、 Perl-NT_CGIページにあるように、test.batをExplolerから実行すると、 DOS窓が一瞬開いてすぐに消えてしまうだけです。 どうしてでしょうか?

Q9. UNIXでは、バックコートを使うことで変数にコマンドの 実行結果が格納されますが、Windows NT4.0 + IIS/PWS4.0 を使ったCGIだとうまくいきません。 コマンドラインからだと問題なく出力されます。 どうすれば可能になるのでしょうか?

test.pl
#!C:\Perl\bin\perl.exe
print "Content-type: text/plain\n\n";
$tmp1 = `cmd /c date /t`;
print "command date \$tmp1-> $tmp1";

$tmp2 = `date /t`;
print "command date \$tmp2-> $tmp2";

Q10. ブラウザから入力した名前を、CGIで処理してブラウザに 表示する簡単なCGIスクリプトを実行しようとしているのですが、 ソースがそのままテキスト形式でブラウザに表示されます。 どうすればいいのでしょうか?

Q11. NT+IIS/PWS上で、 CGI_Liteモジュールを使ったファイルアップロードがうまくいきません。

症状
ファイルを選んで送信ボタンを押すと、
黙り込んでそのうち「インターネット サイトupload.plを開けません。 処理がタイムアウトになりました」と出る。

一向にアップロード処理が終わらない。

エラーになる。

イメージファイルが壊れる。

Q12.CGIプログラムで、

rename $tempfile, $targetfile or die "rename NG:$!";

のようなrename文の箇所があるのですが、この部分で

CGI エラー
指定された CGI アプリケーションは、HTTP
ヘッダーを一部しか返していません。返されたヘッダーは:
rename NG:Permission denied at C:\InetSrv\scripts\guestbook.cgi line 85.
というエラーメッセージが出ることがあります。時々うまく いくこともあるのですが、どうしてでしょうか?

WWWサーバはIIS3.0で、PerlはPerl for Win32ビルド316です。また、$tempfileや$targetfileには適切な書き込み権限を設定してあります。

Q13.

require 'jcode.pl'; の部分で Can't locate jcode.pl in @INC at d:\xxx というメッセージが出ます。 使用環境は、ActivePerl + MS-PWS + Win98 です。

Q14. 次のような、CGIスクリプトを作り実行したところ、 カレントディレクトリには.txtファイルがあるにもかかわらず、 何も出力されませんでした。

[省略] @FILES=glob("./*.txt"); foreach(0 .. $#FILES){print "$FILES[$_]";} [省略] 引数を単純に"*"にしてみたところ、(仮想) ルートディレクトリのファイル一覧が出力されました。 カレントディレクトリのファイル一覧を出力するにはどうすれば よいのでしょうか。


Q14.
次のような、CGIスクリプトを作り実行したところ、 カレントディレクトリにはファイルがあるにもかかわらず、 何も出力されませんでした。 [省略] @FILES=glob("./*.txt"); foreach(0 .. $#FILES){print "$FILES[$_]";} [省略] 引数を単純に"*"にしてみたところ、(仮想) ルートディレクトリのファイル一覧が出力されました。 カレントディレクトリのファイル一覧を出力するにはどうすれば よいのでしょうか。

A.14
原因は、Q.13/A.13と同じと思われます。 対策としては、

   ●フルパスでディレクトリを指定する。('C:/dir/*.txt' 等)
   ●globの前にchdirでカレントディレクトリを「対象ディレクトリ」に変更する。

等になるでしょう。

Q13. require 'jcode.pl'; の部分で Can't locate jcode.pl in @INC at d:\xxx というメッセージが出ます。 使用環境は、ActivePerl + MS-PWS + Win98 です。

A.13
jcode.plを置いているディレクトリが@INCのパスになく、見つからないという メッセージです。 WWWサーバがMS-IIS/PWSの場合、「カレントディレクトリ」が (仮想)ルートディレクトリに強制的に変更されるようです。 つまり、CGIスクリプトが(仮想)ルートディレクトリではないディレクトリにある場合、jcode.plがCGIスクリプトと「同じ」ディレクトリにあっても、そのディレクトリは 「カレントディレクトリ」ではないため、上記エラーになるわけです。

対応策としては、

   ●フルパスでjcode.plを指定する。('C:/cgi-directory/jcode.pl' 等)
   ●requireの前にchdirでカレントディレクトリをjcode.plのあるディレクトリに変更する。
   ●jcode.plを@INCにセットしてあるライブラリディレクトリに置く。
   ●requireの前に、use lib 'TARGET-DIRECTRY';で、jcode.plを置いているディレクトリを@INCに含める。

等が考えられます。

Q12. CGIプログラムで、

rename $tempfile, $targetfile or die "rename NG:$!";

のようなrename文の箇所があるのですが、この部分で

CGI エラー
指定された CGI アプリケーションは、HTTP
ヘッダーを一部しか返していません。返されたヘッダーは:
rename NG:Permission denied at C:\InetSrv\scripts\guestbook.cgi line 85.
というエラーメッセージが出ることがあります。時々うまく いくこともあるのですが、どうしてでしょうか?

WWWサーバはIIS3.0で、PerlはPerl for Win32ビルド316です。また、$tempfileや$targetfileには適切な書き込み権限を設定してあります。

A.12
IIS3.0/4.0で、AS版のPerl for Win32ビルド316あるいはGS版を使ってrenameを使ったCGIを実行した場合、上記のエラーが発生する報告が何件か出ています。対策としては、

  • ActivePerlビルド5xxにアップグレードする。
  • system関数を使って、copyとdelを行う。
  • File::Copyモジュールを使う。
    	use File::Copy;
    	・・・
    	copy($tempfile,$targetfile);
    	unlink $tempfile or die "unlink NG:$!";
    
    等があります。

    Q11. NT+IIS/PWS上で、 CGI_Liteモジュールを使ったファイルアップロードがうまくいきません。

    症状
    ファイルを選んで送信ボタンを押すと、
    黙り込んでそのうち「インターネット サイトxxを開けません。 処理がタイムアウトになりました」等のメッセージ出る。

    一向にアップロード処理が終わらない。

    エラーになる。(Oh, Oh! I'm upset! Can't read what I want.等)

    イメージファイルが壊れる。

    A.11 サーバがNT + IIS/PWSやApacheだとうまく動作しないようです。

    IIS/PWS3.0だとPosting Acceptorが必要です。Posting Acceptorは、Microsoft Site Server, Enterprise Edition等の一部となっていますが、通常のNTだとPosting Acceptorを追加インストールする必要があります。

    Posting Acceptor1.0の入手先:
    http://www.microsoft.com/msdownload/webpubwiz/postacc/01000.htm

    http://www.microsoft.com/windows/software/webpost/post_accept.htm

    注意事項
    http://www.microsoft.com/mscorp/worldwide/japan/support/kb/articles/j030/9/91.htm

    Posting Acceptor1.01は、Microsoft Site Serverに含まれています。 Microsoft Site Server Express(MSSE)2.0が NT4.0のオプションパックに含まれているため、MSSEをインストールすればいいのですが、 自動インストールではNT serverにしかインストールできないようになっています。 しかし、Posting Acceptor1.01はNT workstation4.0でも稼働可能なので、 オプションパックCD-ROMの

    x:\NTOPTPAK\JP\x86\Winnt.SRV\pak210-x86.exe を手動で起動すれば、インストールすることはできます。READMEファイルは、同じディレクトリのpareadme.htmです。
    注)これは推奨しているのではありません。

    Posting Acceptorをインストール後、

    − インターネットマネージャーを使って、アップロード先の仮想ディレクトリ(URL)を書き込み可能にしておきます。
    − NTのユーザ認証が行われますので、同じくインターネット マネージャーを使って認証がパスするように設定しておきます。
    − ブラウザからアップロード用のURLを指定してアップロードの動作確認します。

    なお、CGIでなくても、IIS/PWSのASP機能を使ったアップロードも可能です。方法は、次のようになります。
    上記の設定終了後、クライアントのブラウザから
    http://SERVER-NAME/scripts/Uploadn.asp
    を指定すると、<input type="file" .....>を使用したアップロード用の ページが表示されます。これで、ファイルアップロードができるはずです。

    使用上の問題としては、

  • NTLMによる認証が必須
  • NTLM 認証名に依存したフォルダ以下のフォルダに保存可能
    ということなので、ちょっと使い勝手がよくない感じです。

    使用上の問題は、次の記事を参考にさせて頂きました。
    http://www.geocities.co.jp/SiliconValley/9840/fileup.html

    他にSA-FileUpというシェアウェアがあり、これを入れる手もあります。 ちょっと高いのが難点。

    http://www.nt.users.gr.jp/asp/tips/0011.asp

    http://www.linkcom.co.jp/sa_faq.htm

    他に、Upload3.0というものもあるそうです。

    [CGIスクリプト側での対策]

    CGI_Lite.pmの470行目当たりに

    binmode STDIN;

    を追加します。さらに、open文が2カ所あるので、それぞれの文の直後に

    binmode $handle;

    を挿入すると、とりあえず動くようになりました。
    binmode STDIN;の追加だけでも、テキストファイルやBMPファイルはOKなのですが、JPEGやGIF等だとファイルサイズが大きくなって崩れてしまいます。

    この他代替策として、cgi-lib.plを使い、cgi-lib.pl内部の$cgi_lib'writefilesにアップロードディレクトリをセットして、&ReadParseを実行してアップロード処理する方法があります。

    $cgi_lib'writefiles = "c:/inetpub/wwwroot/upload";

    これはアップロード自体は問題なくできますが、Posting Acceptorを導入していないと、やはりJPEGやGIF等だとうまくいかないようです。また、ファイル名は、デフォルトでは
    $cgi_lib'filepre = "cgi-lib";
    で指定した名前の下に、プロセス番号と処理中のシリアル番号がつくようになっています。アップロードするファイルの名前にしたい場合修正が必要です。

    また、標準モジュールであるCGI.pmを使うこともできます。
    http://www.t3.rim.or.jp/~hirose31/docs/upf.html

    なお、イメージファイルやMS-Word等のバイナリーファイルをアップロードする場合、 CGIスクリプト中で適切なContent-Type: をセットする必要があることに注意してください。

    その他、適切な処理の仕方をご存じでしたら、ご一報頂けるとありがたいです。

    プロキシサーバのリダイレクト(プロキシサーバにアクセスしてから、 WWWサーバにアクセスしている場合)も同じようなエラーが出るようです。 この場合は、ブラウザをno proxyにセットします。

    関連記事

    http://www.microsoft.com/mscorp/worldwide/japan/support/kb/articles/j042/5/45.htm

    http://www.big.or.jp/~talk/t-club/soft/wwwboard/messages/153.html

    http://www.tsden.org/ryutaroh/fileupload-j.shtml

    Q10. ブラウザから入力した名前を、CGIで処理してブラウザに 表示する簡単なCGIスクリプトを実行しようとしているのですが、 ソースがそのままテキスト形式でブラウザに表示されます。 どうすればいいのでしょうか?

    A10. よくある原因としては、

    CGI対象の拡張子が登録されていない。
    CGI対象のディレクトリのアクセス権に実行権をセットしていない。

    等があるようです。

    設定方法については、 PerlのCGIデバッグ環境の構築:MS-IIS/PWS4.0編 を参考にして下さい。

    Q9. UNIXでは、バックコートを使うことで変数にコマンドの 実行結果が格納されますが、Windows NT4.0 + IIS/PWS4.0 を使ったCGIだとうまくいきません。また、パイプも 使えません。 コマンドラインからだと問題なく出力されます。

    A9. IIS/PWS4.0から設定が変わったようです。 設定を変えないで実現しようとすると、 一旦system()でファイルに書き出して、 ファイルから読み出すようにします。
    	$tmpfile = "c:\\temp\\tmp.txt";
    	system("date /t > $tmpfile");
    	print "Content-type: text/html\n\n";
    	print "<html><body>";
    	print "<PRE>";
    	open(TEMP,$tmpfile);
    	while(<TEMP>){
    		s/>/&lt;/g;
    		s/>/&gt;/g;
    	}
    	close(TEMP);
    	print "</PRE>";
    	print "</html></body>";
    	unlink($tmpfile);
    	exit;
    
    オプションパックでは、以下の方法があるようです。 [perl-win32-j ML & Takahiro Shibataさんに感謝]

    注)レジストリ等の編集の結果、万が一問題が発生しても著者は責任を負いません。自己責任で実施してください。

    Internet Information Server(IIS)3.0以前のバージョンでは、
    \\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters
    に、REG_DWORDでCreateProcessWithNewConsoleを作成し、値を1にセットしていましたが、これは4.0では無効になっています。

    Q8. WindowsNT Workstation+PWSでWWWを構築しているのですが、 Perl-NT_CGIページにあるように、test.batをExplolerから実行すると、 DOS窓が一瞬開いてすぐに消えてしまうだけです。 どうしてでしょうか?

    A8. Microsoft IISの2.0以上については、デフォルトではBATファイルは CGIの対象外となっていますので、そのままではCGIとしては機能しません。 拡張子と実行プログラムの関連付けをIIS(3.0まではレジストリ)に追加登録 する必要があります。 但し、BATファイルはセキュリティ上の問題が生じやすいので、使用には 十分な配慮が必要です。

    Q7. マイクロソフトのIISでSSIをやろうとしているのですが、 全然機能しません。どうしてでしょうか?

    A7. マイクロソフトのIIS2.0までは、NCSA httpd等が持っている SSIの全機能を完全にサポートしていませんでした。そのため、アクセスカウンタ等に 利用される<!-- #exec cgi="counter.cgi?" -->のような 構文は使用できませんした。3.0からActvie Server Pagesを追加導入するとほぼ 全機能が使用可能になりました。4.0以降では、最初からSSIのほとんどの機能が 使用可能になっています。
    但し、4.0以降では、<!-- #exec cmd="perl xxx.pl" --> の実行には、 レジストリで SSIEnableCmdDerectiveをTRUEにするという設定が必要となっています。
    設定方法はヘルプの、 IIS -> 管理者用リファレンス -> レジストリ -> WWWサービス のレジストリエントリの「SSIEnableCmdDerective」の項 を参照してください。Win2000(RC2)では、http://localhost/iisHelp/のIIS5.0 DocumentationのIndexタブで「#EXEC」および「SSIEnableCmdDerective」の項を参照してください。

    ちなみに、<!-- #exec cmd="perl xxx.pl" -->を可能にするには、 regedt32/regeditを起動して、レジストリ

    HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet \Services \W3SVC \Parameters に「SSIEnableCmdDerective」を追加して、値を'1'に設定します。

    regedt32の場合、編集 -> 値の追加 をクリックして、値の名前 に SSIEnableCmdDerectiveを記入し、データ型はREG_DWORDを選択します。DWORDエディタが現れるので、データ(D)に1を入力します。基数は何でもかまいません。

    regeditの場合、編集 -> 新規 -> DWORD値をクリックすると、右のウィンドウに新しい値が生成されるので、名前をSSIEnableCmdDerectiveとします。その名前の位置で左クリックして現れるメニューから変更を選択します。DWORD値の変更ウィンドウが出てくるので、値のデータ欄に1を入力します。ベースはどちらでも構いません。

    注)レジストリの編集の結果、万が一問題が発生しても著者は責任を負いません。自己責任で実施してください。

    注)MSはセキュリティ上問題があると考えて、デフォルトを禁止状態に しているものと思われます。 CGIスクリプトを起動したいだけであれば、デフォルトで使用可能な <!-- #exec cgi="xxx.cgi" -->を利用されることを推奨致します。

    なお、4.0以降のIIS/PWSで、SSIの#execを無効にする方法については、 http://www.microsoft.com/JAPAN/support/kb/articles/J049/1/77.htm に記述されていました。

    古いバージョンについては、上記の 「The Microsoft IIS FAQの和訳」 1.6) サーバサイドインクルード(SSI)をサポートしていますか を参照して下さい。
    http://www.t3.rim.or.jp/~nog/pcpage/iisj.html#1.6


    Q6.perl を使用し form から受けたデータを パイプ経由でmail で送信しようとしているのですが、うまくいきません。 どうしてでしょうか。 環境: WindowsNTserver 4.0 IIS 2.0 Perl v5.001 build 110 ANT sendmail with pop3 1.1 --test.pl--- print"Content-Type:text/html\n\n"; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); print "<HTML>\n"; print "<HEAD>\n"; print "<H1>hello world</H1>"; print "</HEAD>\n"; print "<BODY>\n"; print "<P>"; print "buffer=$buffer"; print "<P>"; print "your submit has been completed !\n"; $mailprog = "sendmail -t 'nobody'" ; open(MAILER,"|$mailprog") || print "Cannot write to the data file!"; #標準エラーはブラウザには渡されないため、標準出力にprint print(MAILER "From : nobody\r\n"); print(MAILER "To : administrator\r\n"); print(MAILER "Subject : test\r\n"); print MAILER $buffer; close(MAILER); ---end test.pl--- A6. 通常ですと、 等が考えられますので、パイプではなく、ファイル渡しにして 原因をそれぞれ確認することになります。 しかし、IIS2.0には 「Perlスクリプトの中で標準的なプログラムI/Oが使えない」 という問題があります。

    Perl スクリプトの中で標準的なプログラム I/O が使用できない
    http://www.microsoft.com/JAPAN/support/kb/articles/J028/6/96.htm

    具体的には、 「親スクリプトから生まれる(spawned) 別のperlスクリプトや 外部コマンドから/ あるいはそれらへ引数やデータを受け渡すという、 標準的なプログラムI/Oメソッドが使えない」というものです。

    原因は、「CGIアプリケーションからスクリプトや外部コマンドを 起動(spawn)した場合、それは別プロセスとして生成されます。 デフォルトでは、MS-IIS2.0はコンソールを生成せず、プロセス間の 標準I/Oのリダイレクションをサポートしません。」ということです。

    対策としては、レジストリのキーを編集します。 しかし、間違うとシステムが潰れる可能性もありますので、リスクを承知で 自分の責任において実施しなければなりません。また、 「各々の CGIスクリプトに対して新しいコンソールを生成すると重大な パフォーマンス上の問題に巻き込まれる可能性があり、 より遅いパフォーマンスが受け入れられない限り実施すべきではありません」 という注意書きがでています。

    変更するのはHKEY_LOCAL_MACHINEサブツリーのサブキー: \SYSTEM\CurrentControlSet\Services\W3SVC\Parametersの 値の名前: CreateProcessWithNewConsole
    データ タイプ: REG_DWORD
    データ:1
    詳細は上記のmicrosoft の Knowledge Base のURLをご覧下さい。


    この項は小森園 輝貴さんのご協力を頂きました。 ありがとうございました。


    Q5.IISで関連付けを.pl=perlIS.dllとすると、ネットスケープの ブラウザではうまく出力できまくなりました。 何かおかしいのでしょうか。
    A5.ネットニューズfj.os.windows-ntに関連記事が出ていましたので、 引用させて頂きました。
    −−−−−引用ここから−−−−−−
    
    
    From: "Toshiyuki Kishii" 
    Newsgroups: fj.os.windows-nt
    Subject: Re: IIS de CGI  ga ugokanai
    Date: 12 Nov 1996 06:57:22 GMT
    Message-ID: <01bbd066$d0180fa0$9f01028c@pensck.tec.nsc.nikko.co.jp>
    
    
    
    中村秀紀   wrote in article
    <5663rg$a29@jupiter.tokyo-gas.co.jp>...
    >  これ、私も便乗質問したいのですが、私のほうはIISとPERL5
    > を使用しているのですが、やはりヘッダ情報ががうまくわたりません。
    > Content-type: XXXXXX/XXXと書いてもそれがそのまま表示されてしまい
    > ます。
    > 
    >  PERL5ではPERLIIS.DLLというものを介してISAP
    > Iで情報をやりとりしているはずですが、サーバ側が悪いのか、このD
    > LLが悪いのかよくわからないんですよね。ISAPIを使ったテスト
    > プログラムを書いてみるのが良いのかもしれませんが、これは結構面倒
    > くさいです。ちなみに根本的な解決策ではありませんが、ヘッダ情報を
    > 何もつけないようにすると、デフォルトでtext/htmlとして解釈するよう
    > で、とりあえずhtml文書はprintできるようになりました。(各タグの
    > 最後にいちいち改行コードを入れないとうまく動きませんでしたが)
    > 
    
    NTのメーリングリストで私も同じ質問をしたのですが、
    検証した結果は以下のようになりました。
    
    1.IISのスクリプトの関連付けが,.pl=perlIS.dllのとき
    ・IE3.0J
      HTMLソースのみの出力で、正常表示
    
    ・NetscapeNavigator3.0Gold
      HTMLソースのみの出力だと、ブラウザがapplication/x-perlの
      関連付けを要求し、保存などを選択する必要あり、
      保存内容は改行コードがx'0A'のみになる。
    
      print "HTTP/1.0 200 OK\nContent-Type: text/html\n\n";
      をHTMLソースのまえに出力することで正常表示
    
    2.IISのスクリプトの関連付けが,.cgi(.pl以外)=perlIS.dllのとき
    ・IE3.0J
      HTMLソースのみの出力で、正常表示
    
    ・NetscapeNavigator3.0Gold
      HTMLソースのみの出力で、正常表示
    
    --
    岸井 利幸  kishii@tec.nsc.nikko.co.jp
    日興システムセンター 通信システム課
    
    
    Newsgroups: fj.os.windows-nt
    From: mishima@osa.sci.jri.co.jp (Masahiro Mishima)
    Subject: Re: IIS de CGI ga ugokanai
    Message-ID: 
    Date: Tue, 12 Nov 1996 05:39:26 GMT
    
    In article <5663rg$a29@jupiter.tokyo-gas.co.jp> hidenori@iti.tokyo-gas.co.jp (=?
    ISO-2022-JP?B?GyRCQ2ZCPD0oNSobKEI=?= ) writes:
    
        これ、私も便乗質問したいのですが、私のほうはIISとPERL5
       を使用しているのですが、やはりヘッダ情報ががうまくわたりません。
       Content-type: XXXXXX/XXXと書いてもそれがそのまま表示されてしまい
       ます。
    
    Content-Type の前に
    Status: 200 OK
    という1行をつけるとうまくいくようです。
    
    IIS は PerlIS.DLL を実行するときに、ヘッダを全く出力しないようです。
    ひょっとするとこれはいけないことで、ステータス行はサーバが出すべきもの
    なのかもしれません。
    
    RFC1945 をじっくり読むとわかるかも...。
    
    --
    (株)日本総合研究所 インフォメーション・テクノロジ事業部
       ドキュメント・エンジニアリング・グループ 三嶋 正弘
    
    −−−−−引用ここまで−−−−−−
    
    

    Q3.マニュアルか何かの文献において、Perlプログラムの 呼び出しは、例えば http://xxx.xxx.xxx/cgi-bin/xxx.pl? の様に行うとありました。 そこで、IE3.0でこの様なリンクを張ると正常に動作するのですが Netscapeで同じことをすると呼び出せません。

    Q4.今回perlでCGIスクリプトを作成しましたが、 簡単なものでさえ上手くいきません。何故かファイルのセーブを行ってしまいます。 コマンドラインからはうまくいっています。


    A3.&A4.上記のmicrosoftのURLから辿れるWWWページに下記事例があります。

    概要

    マイクロソフト インターネット エクスプローラのような Web ブラウザから CGI アプリケーションを実行しようとする とき、ブラウザはサーバー上で実行しようとせずにその アプリケーションをダウンロードしようとする場合があります。

    原因

    IIS では CGI スクリプトの最後に "?" を付けてコールする必要があります。

    回避方法 URL に疑問符を付けてコールしてください。

    例:
    "http://server/scripts/testcgi.exe"

    下記のように変更します。

    "http://server/scripts/testcgi.exe?"


    Q1.
    よく分からないのですが、CGIは、なにも設定せず、動きました。
    /cgi-bin/等何か、設定する必要があるのでしょうか?

    A1.
    IISなら、特に必要ないかと思います。
    \scripts\下の領域が/cgi-bin/相当ということになっているようです。
    #但し、下記警告にあるような危険があるので、 NTFSにしておいて、ACL(アクセス制御リスト)で管理者以外の人が 自由に書き込んだりできなくしておく必要があります。


    Q2.
    NTPerlを使いたいのですが、コマンドプロンプトからは動くのに、URLからは、

    CGIエラー 
    指定せれたCGIアプリケーションは、HTTPヘッダーを 一部しか返していません。
    返させたヘッダーは:

    という状態になってしまいます。

    callするCGI
    @ECHO OFF
    C:\IIS\scripts\perl\perl.exe C:\IIS\scripts\test.pl

    test.plは、
    print "Content-type: text/plain\n\n";
    print "test";
    です。


    A2.
    これはIISのバグです。microsoftのWWWの
    http://www.microsoft.com/kb/bussys/iis/q145661.htm に出ています。
    test.plにヘッダ情報を追加して

    print "HTTP/1.0 200 OK\n";
    print "Content-Type: text/html\n\n\n";
    print "test";

    としてやってみてください。

    また、下記スクリプトでもやってみてください。
    #Microsoftご推奨版。(^^;;
    ファイル名は helloworld.pl とします。

    print "Content-Type: text/html\n\n";
    print "<HTML>\n";
    print "<HEAD>\n";
    print "<TITLE>Hello World</TITLE>\n";
    print "</HEAD>\n";
    print "<BODY>\n";
    print "<H4>Hello World</H4>\n";
    print "<P>\n";
    print "Your IP Address is $ENV{REMOTE_ADDR}.\n";
    print "<P>";
    print "<H5>Have a nice day</H5>\n";
    print "</BODY>\n";
    print "</HTML>\n";


    次にレジストリを変更します。
    但し、これは at your own risk です。 下手にいじると重大な障害を引き起こすことがあります。 当方は結果については責任を負いませんので悪しからず。

    1. Regedt32.exe を起動し、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap を開きます。
    2. 編集メニューから新規作成(値)をクリックして選択します。
    3. 値の名前は .pl とします。
    4. データタイプは REG_SZ とします。
    5. 文字列の値は <絶対パス>\perl.exe %s とします。
    6. WWW サービスを再起動します。

    これでブラウザからPerlスクリプトのテストができるはずです。 次のようなURLでやってみてください。
    http://<サーバ名>/scripts/helloworld.pl?

    出所: http://www.microsoft.com/kb/bussys/iis/q150629.htm
    Configuring and Testing a PERL Script with IIS Article
    ID: Q150629 Revision
    Date: 24-JUL-1996

    <警告>

    1. 上記のような設定にした場合、perlスクリプトを自由に実行できるようになるので、 セキュリティが脅かされます。 Windows 95/NTでPerl&CGIのページを参照してください。
    2. したがって\scripts\下の領域は、ACL(アクセス制御リスト)で管理者以外の人が 自由に書き込んだりできなくしておく必要があります。当然NTFSが前提です。
    3. また、\scripts\に置くスクリプトは、事前にセキュリティチェックを すべきです。
    4. 上記のQ2.の例にあるように、\scriptsのようなところへ、perl.exeのような 強力な 実行イメージをおくのはセキュリティ上大変危険です。 一般ユーザやURLからまったくアクセスできないパスにおきましょう。(^^ ;
    −−−「The Microsoft IIS FAQの和訳」引用ここから−−−

    3.*) WWW - CGIの質問全般

    3.1) CGIとは何ですか  どこでその情報を得ることができますか

    CGIとは common gateway interface のことです。 CGIに関してもっと情報がほしい場合は次のサイトで入手できます。 http://hoohoo.ncsa.uiuc.edu/cgi/overview.html. "Common Gateway Interface (CGI) はHTTP、Webサーバのような インフォメーションサーバと外部アプリケーションの標準インタフェースです。Webデーモンが送る生のHTML文書はスタティックなもので、これはテキストファイルが変更できない、いつも決まったものであることを意味しています。一方CGIプログラムはリアルタイムで実行されるので、ダイナミックな情報を出力できるのです。" (From http://hoohoo.ncsa.uiuc.edu/cgi/intro.html).

    CGIアプリケーションはIISで実行できますが、IISはCGIよりも速い、 -- ISAPIインタフェースを持っています。

    !3.2) WinCGIとは何ですか  どこでその情報を得ることができますか

    WinCGIはWindowsプログラマがよりWindowsライクなアプローチを使って -- つまり標準のWindows INIファイルを通して、CGIアプリケーションを書ける ようになっています。この仕様は次のサイトで入手可能です。 http://website.ora.com/wsdocs/32demo/windows-cgi.html VB/Accessを使ったWinCGIプログラムのサンプルを見たいときは次のサイトが よいでしょう。 http://website.ora.com/devcorner/db-src/index.html

    3.3) CGIアプリを実行すると "403 - Forbidden Access"が起きてしまいます

    Internet Information Serverマネージャで設定するディレクトリの アクセス権とファイルセキュリティのアクセス権を一致させる必要があります 。CGIアプリケーションを含むディレクトリに対して実行チェックボックスが チェックされている必要があります。 (David A.Baker <dave@canon.bhs.com>)

    3.4) WinCGIの仕様で作られたVBアプリはIIS上で 使えますか

    純粋なCGIとは何か、Bob DennyのWebSiteサーバで動作するもう一つの 一級品である"Windows CGI"とは何か、ということに多少の混乱が あるようです。IISは標準的なCGIをサポートしています。 Windows CGIはVBでWebサーバの機能を拡張するために開発されました。

    SDKの中にあるIS2WCGIのサンプルを見てください。 見れば理解できるでしょう。これはWindows CGIアプリケーションをコールする ISAPIアプリケーションです。Windows CGIは深刻なスケーラビリティの問題を 抱えていますが、Webサイトを手早く拡張することのできる手段です。 OLEISAPIを調べることを薦めます。これもまたVBでWebサーバを拡張する手段で すが、Windows CGIで起きるようなプロセスの作成とファイルI/Oに関わる オーバヘッドがまったくありません。 (Lee Hart <leehart@exchange.microsoft.com>)

    3.5) 16ビットVBアプリやDelphyのCGIアプリは IISで使えますか なぜIS2WCGIは動かないのですか

    はい、使えます。開発者の方はIS2WCGI.DLLにはリビジョンがあることに 注意してください。このDLLは多くのサイトで上手に利用されています。 IS2WCGIはMS Internet SDKにあるDLLのひとつです。

    ここにはIISからWinCGIアプリケーションを動かすための速くて汚いリストが あります。
    1. Microsoft ActiveX SDKからIS2WCGI.DLLを取ってください。 もしMS C++を持っていない場合は次のサイトで入手してください。 http://rampages.onramp.net/~steveg/is2wcgi.dll.
    2. コントロールパネルを起動して"サービス"をダブルクリック してください。WWWパブリッシングサービスを選んでスタートボタンを クリックしてください。サービスが動作するように画面上でボタンを チェックしてください。
    3. /inetsrv/scripts ディレクトリに is2wcgi.dll をコピーしてください。
    4. is2wcgi.dllを .dll の拡張子を除いて WinCGI の exe ファイルと同じ ファイル名にリネームしてください。例えば FRMSRCH.EXE というWinCGI プログラムがあったとすると is2wcgi.dll を frmsrch.dll とリネームします。
    5. www.yoursite.com/scripts/frmsrch.dll のようにWinCGIをコールします。
    より詳しい情報は is2wcgi のソースコードを参照してください。

    3.6) CGIアプリを実行すると "access denied"が起きてしまいます

    この問題はサービスマネージャで "実行" をマークしていない ディレクトリのスクリプトを実行しようとしているために起きていると 考えられます。そのスクリプトを /scripts ディレクトリに移動するか、 サービスマネージャでディレクトリの設定を変更してください。

    3.7) Perlのスクリプトはどうやって動かすのですか

    バッチファイルを使う代わりにURLとして http://xxx.zzz/..../myscript.pl を使うことができます。 しかしこのためにはIISが .plファイルを認識するようにレジストリの変更が 必要です。:

    次のキーに値を追加します。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ScriptMap

    私のマシンでは次のようにしています。 .pl=c:\perl5\perl.exe %s %s (Marius Milner <Marius.Milner@octel.com>)

    3.8) cmd/batファイルのセキュリティ

    セキュリティ上の理由によりサーバ上での .bat と .cmd ファイルの使用には強く反対します。たとえ .cmd/.bat のfixを行なったとしてもシェルスクリプトは危険なことに変わりはありません。(例えば、環境変数の表示はあなたへの攻撃を誘発させます) (JohnLudeman <johnl@microsoft.com>)

    −−−引用ここまで−−−


    mailto:ご意見、ご要望、ご質問は、 電子メールまたは 質問に お願い致します。
    ホームページへ戻る。