• ベストアンサー

CGIへ飛ばずに処理だけさせたい

HTMLのフォームからsubmitしてcgiにアクセスする。 cgiでHTMLからのポストとゲットを読み込んで ログファイルに書き込む。 というCGIを作ったんだけど、 print "Content-type: text/html\n\n"; を書かないと、submitしてからcgiの処理が 止まらないみたいでした。 print "Content-type: text/html\n\n"; を書くと、処理は正常になるけど、cgiファイルに ジャンプしてしまいます。 openで書き込みをする場合、cgiに飛ばずに 処理する方法を教えてください。

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

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.5

サンプル作ったげるから自分で考えてください。 いろいろなやり方があります(ありすぎてどれでも良いですね) (今回は、A__さんが<img なら~)とあったので、 img書いてみますか。。。。 a.html -------------- <html> <head> <meta http-equiv="content-type" content="text/html;charset=shift_jis"> <style type="text/css"><!-- #layer { position: absolute; top: 0px; left:0px; width: 0px; height: 0px; visibility: visible }--> </style> </head> <script language="javascript"><!-- function CGI() { layer.visible=false; layer.innerHTML="<img src='a.cgi?"+document.myForm.textareaName.value+"' width=0 height=0>"; } //--></script> <body> <form name="myForm"> <textarea name="textareaName"></textarea> <input type="button" name="submitButtonName" value="AB" onclick="return CGI();"> <div id="layer">a</div> </body> </html> a.cgi ----------------- #/usr/bin/perl; $_=$ENV {"QUERY_STRING"}; open FH, ">text.txt"; print FH $_; text.txt ----------------- 空っぽでもなんでもOK あとは、研究してみてください。今回はGETの例ですね。 POSTは。。。まぁ、応用すればわかるでしょう。 頑張ってくださいね。

A__
質問者

お礼

後からimgタグを書いてCGIにアクセスするという ことができてしまうんですねー。 とても勉強になりました。 POSTデータはGETにまわして、教えてくれた ソースを利用して、おとなしく送信させることができました。 ありがとうございます。

その他の回答 (4)

  • kazu-kun
  • ベストアンサー率31% (72/232)
回答No.4

フォームからSubmitしてCGI処理した後に、ブラウザのアドレスバーに表示されるURLをCGIのものではなくHTMLにしたいということですよね。 それなら、補足で書いていらっしゃるように、 print "Location:http://www.yahoo.co.jp/\n\n"; 等とするしか方法はありません。 それで何か問題があるのでしょうか?

A__
質問者

お礼

Submit後のアドレスバー表示をHTMLにしたい というのではなく、CGIにジャンプしてしまう というのをやめさせたたかったんです。 print "Location:http://www.yahoo.co.jp/\n\n"; の方法でも、同じアドレスだけど、ジャンプするから HTMLの表示状態が初期化されてしまうから それも避けられる方法を探していました。

  • kawausok
  • ベストアンサー率46% (13/28)
回答No.3

#2の補足ですが。。。 CGIとPerlについてご存知であればわかると思っていたのですが。。。 CGIはWebの操作にたいしてWeb画面に応答を返します。 <IMG A=****.cgi> とやるケースでも、「画像データ」という応答を返しています。 そういう意味では、「処理が止まらない」ように見えるのは、「CGIからの応答を返していない」ために、IEでは「応答を待ちきり」の状態になっているということだと思います。 # ようはprint文で何らかの応答を返す必要があるということです 話を戻しますが、ログファイルにデータを書き込むCGIを作成する場合、普通はCGIの実行結果をWeb画面に出力するように作ると思います。 # 「ログの書き込みが正常終了しました」とか・・・ そうしないと、ご質問の事象のように、処理が終わっているのかどうかわからないような事態になるんだと思いますよ。

A__
質問者

補足

img src= なら #!/usr/bin/perl @jikan = localtime(time); open(F,">>aaa.txt"); print F @jikan; close(F); で、HTMLのままcgi処理できることが分かりました。 これならcgiへのアクセスはIEを見ていて、 一瞬で終わっただろうと感じました。 submitではHTMLのままcgiでゲットとポストを 読んで書き込む方法はありませんか?

  • kawausok
  • ベストアンサー率46% (13/28)
回答No.2

CGIの処理の流れについては下記のURLが参考になると思います

参考URL:
http://tohoho.wakusei.ne.jp/wwwcgi.htm
A__
質問者

補足

ありがとうございます。 一括ダウンロードでCGIとPerlは全て熟読しました。

  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.1

おっしゃっている意味がよくわからないのですが、 「CGIの処理が止まらない」とはどういう意味なのでしょう? 無限ループ? print "Content-type: text/html\n\n"; というのは「これからprintするものは、テキスト形式で書かれたHTMLだよ」 という宣言のようなものなので、HTMLを出力するときに必須です。 これを書かないとエラーになるのですが、そういうことではないのですか? また、「CGIに飛ばずに処理」とおっしゃっていますが、CGIにジャンプせずに (CGIを呼び出し、実行せずに)CGIで処理を行うなんて不可能です。 もし、処理後に表示するページの拡張子をHTML等にしたいのであれば、 何も表示せずに処理後表示したいHTMLに強制ジャンプをさせればよいです。

A__
質問者

補足

CGIの処理が止まらない というのは、IEを見ていてなんとなくそう思った だけなんだけど、エラー表示は出ないんです。 例えば、カウンターなら、HTMLを開けば img src=a.cgi とかでアクセスして処理ができるけど openして書き込みをする場合はcgiへのシャンプは 必ずしなければいけないのかを知りたいです。 cgiに飛ばないといけないけど、 print "Content-type: text/html\n\n"; は書く必用無いということなら print "Location:http://www.yahoo.co.jp/\n\n"; とかで、すぐに元のHTMLに戻らせたいと思っています。

関連するQ&A