• ベストアンサー

特定CGI「だけ」が、ローカル環境で実行できない原因について。(POSTでのフォーム送信はローカル実行不可?)

こんばんは。 サーバでは問題なく動くCGI(Perl)が ローカルPC環境で動きません。 ローカルのHTMLファイルから呼び出すと CGIファイルがテキストとして表示されます。 しかし、パス関係の間違いはありません。 動かないCGIファイルを「print "Hello!";」などの 単純な文章に書き換え、同じHTMLから呼ぶと動きます。 また、「Perl文法チェックサイト」で チェックしても、文法間違いはありません。 ほかにどういった原因が考えられますでしょうか? ---------------------------------------- なお、ローカルのHTMLでは 「form」にラジオボタンを配置、 「submit」で「POST」送信したうえで その結果によってHTMLを生成出力するようにしています。 ここらへん、まったくよく分かっていないのですが もしかして、こういう送信はローカルでは 実行できないとかあるのでしょうか? 送信部分を削って、HTML出力だけのCGIにすると動きます。 繰り返しますがサーバ上では動作しています。 よろしくお願いいたします。 ---------------------------------------- ◆環境◆ WindowsXP IE6.01 httpd 1.42m  ActivePerl(バージョンの見方が分かりません)

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

><form action="http://127.0.0.1/~***/***/cgi-bin/test03.cgi">としたら動く よくある勘違いだと思うけど、formを記述しているファイルもローカルサーバー経由 (http://127.0.0.1/~***/***/xx.htmlなど)で呼び出してないと、 単なる、ファイル表示では、file:///d:/xxx..../xx.html というアドレスになり、 相対アドレス指定では、file:///d:/xxx..../test03.cgiを呼び出すことになるのでテキスト表示になってしまいます。

JumpingQueen
質問者

お礼

納得できましたので締め切ります。 どうもわたしに勘違いがあったようです。 お騒がせして申しわけがありませんでした。 また、ありがとうございました。

JumpingQueen
質問者

補足

ご回答ありがとうございました。 あらら。ということは、質問文に書いた 私の以下の文章は、「あなたねぇ、ウソをついて 人をからかってはいけませんよ」と いうことになりますか? > 動かないCGIファイルを「print "Hello!";」などの > 単純な文章に書き換え、同じHTMLから呼ぶと動きます。 焦ってもう一度やってみたら、今度は動かない。 過日は文章出力で試したため、テキスト表示されたのを 動作したと勘違いしてしまったのかなぁ。 「いや、そんなはずはない」という思いもあるため いましばらく確認作業をしてみます。 ちなみにWWW検索したらこんな文書がありました。 ---------------------------------------- CGIファイルから別のCGIファイルやPLファイルを呼び出して 使用する場合には、この関連付けが機能しない為、注意が必要です。 呼び出す方のCGIファイルには、呼び出されるCGIファイルを 絶対パスにて指定しなければなりません。 http://sakaguch.com/WWWserver.html ---------------------------------------- CGIファイルから呼び出してはいませんが、 理屈的にはこれと同じということでしょうか? 検証を続けて、納得できましたら締め切ります。 ありがとうございました。

その他の回答 (1)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

もしかしてメールを送信しようとしているとか? SENDMAILとかで。 その場合、SENDMAILをインストールして、正しいパス指定をしなければいけません。 WIN版のSENDMAILは有料ですけども。 そうでない場合はその送信部分のソースを見ないと答えられません。

JumpingQueen
質問者

お礼

すみません、補足です。 ふと気になってHTMLの <form action="../cgi-bin/test03.cgi">の部分を <form action="http://127.0.0.1/~***/***/cgi-bin/test03.cgi">と ローカル上の絶対指定にしたら動きました。 ここがおかしいということのようですが 相対指定ではいけないのでしょうか? なお、サーバ上とミラーリングしていますので 相対パス自体は間違っていません。

JumpingQueen
質問者

補足

ご回答ありがとうございました。 残念ながらsendmailは使っていません。 ラジオボタンを押してボタンでsubmitし、 valueが0と1の場合で違うHTMLを生成し出力するだけのものです。 「記述すると動かなくなる部分の」perlスクリプトと それを呼び出すHTML部分は以下のとおりです。 (機能拡張を予定しているため、現在は意味のない記述もしています)。 ただ、何度も繰り返しますが、サーバでは動いています。 なお、Perlのパスはでたらめですが、 でたらめでも動くような環境にしています。 ◆HTML◆ <form action="../cgi-bin/test03.cgi" method="post" enctype="text/css"> <p><input type="radio" name="answer" value="0" tabindex="1" accesskey="F" />回答例1</p> <p><input type="radio" name="answer" value="1" tabindex="2" accesskey="S" />回答例2</p> <div><input type="hidden" name="FileName" value="*****" /></div> <div><input type="submit" value="答える" tabindex="3" accesskey="A" /></div> </form> ◆Perl◆ #!/usr/local/bin/perl require './jcode.pl'; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buf); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; &jcode'convert(*value,'euc'); $FORM{$name} = $value; } print "Content-type: text/html\n\n"; if($FORM{'answer'} == 1){ print *****; } else{ print *****; }

関連するQ&A