• ベストアンサー

cgi内から別のcgiを呼び出す。

お世話になります。 分からないならではの質問かと思いますが、 標題の通りです。 cgiXの中からcgiYを呼び出したい(コントロールを渡したい) のです。 どう考えればよいのでしょうか。 これまでは、formのactionにcgi名を書き、 submitによってコントロールを渡してきました。 submitせず単純にコントロールを渡したいのです。 宜しくお願いします。

  • CGI
  • 回答数7
  • ありがとう数6

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.7

また具体例忘れてました。 出力HTMLの先頭にMETAタグで <meta http-equiv="Refresh" content="15;URL=http://www.test.com/パス/cgiY.cgi"> などとすれば表示15秒後に指定のCGIにとびます。 追伸: 前の回答でREFRESHのつづり間違えてました。スイマセン。

nagahaha
質問者

お礼

何回もまことに有り難うございます。 解決しました。 全ていわれていることは理解できたのにうまくいかないので、 一から見直しましたところ、 print "Content-type: text/html\n\n"; が冒頭に入っていました。 これを各rtnに移したところ、あっけなく解決してしまいました。 大変お世話になりました。 (昨日当サイトのメンテのためにお礼が遅くなりました)

その他の回答 (6)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.6

お察しの通りです。 Locationより先に他のHTTPヘッダを出してしまうとLocation部分はコンテンツの1部として認識されてしまいます。 ブラウザ側の命令の受付は一回こっきりですから制御をうつしたいのなら何も表示してはいけません。 いったん表示させてから移したいのなら出力HTML内に仕込むしか方法はありません。 手っ取り早い方法としては<META>タグのRefleshを使うかJavaScriptしか手は無いでしょう。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.5

本当にすいません。 誤解のないようにもうちょっと具体的に書きます。 ↓↓↓↓↓↓↓↓↓↓↓↓↓この下から #!/usr/local/bin/perl ## ここにあなたの処理:ただしprint文など表示系の命令は一切無し ## 最後にこれ↓ print "Location: ./cgiY.cgi\n\n"; ↑↑↑↑↑↑↑↑↑↑↑↑↑この上まで 以上です。

nagahaha
質問者

お礼

何回も有り難うございます。 ここが問題でして。 >#!/usr/local/bin/perl  これはcgiの全く頭(1行目)ですよね、 >## ここにあなたの処理:  ここが問題です、  具体的にはここにデータの吐き出しを書いています。 >ただしprint文など表示系の命令は一切無し  データの書き出しはありませんが、  サブrtnでhtmlは書き出しています。  これが駄目なのでしょうか。 >print "Location: ./cgiY.cgi\n\n";  これがそのまま出て(表示)されてしまいます。   やはり、直下にないというのが原因でしょうか。 しつこくて済みません、 宜しくお願いします。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

たびたびすいません。 具体例忘れてました。 #!/usr/bin/perl print "Location: ./cgiY.cgi\n\n"; だけです。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

HTTPヘッダについて エンドユーザが使用しているブラウザへの命令だと思ってください。 命令のケツは「\n\n」であることをまず念頭において・・・。 通常のCGIだと「Content-type: text/html\n\n」がエンドユーザのブラウザに渡されてそれ以降をHTMLのテキストデータが来るよと判断されその処理を行ないます。 「Content-type: text/html\n\n」ならベタテキスト。 「Content-type: image/png\n\n」ならPNGのバイナリデータ。 という具合なのですが、 それらは「Content-type」というぐらいなので内容のタイプを指定しますよというのがわかります。やろうと思えばCSVデータを送ってExcelでデータを開かせることも可能です。 他にもいろいろあるのですが、ここにアクセスしろ!というのが「Location:」なのです。 こんな感じでわかります?

nagahaha
質問者

お礼

早速具体的に有り難うございました。 よく分かります。 こういっては何ですが、そうかなと思っていました。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

単純に渡すだけならHTTPヘッダ使って print "Location: ./cgiY.cgi\n\n"; と書いてはどうでしょう。 データを渡したい場合、GETメソッドならそのまま上記CGI名以降にパラメータをつけてやればよいのですが、POSTするとなるとcgiY.cgiの作り方しだいになってしまいます。 1.systemやexecを使ってパラメータとして渡す → CGIのPOSTメソッドでは渡されないので@ARGVを使う(これは厳密にはCGIとはいいがたいし、処理終了時にはcgiXに制御が戻る) 2.Socketなどモジュールを使って自身のサーバにポート80にアクセスして、HTTPリクエストでCGI指定し、「Content-Length」でデータサイズとデータをPOSTする。 3.面倒なのでやってみたことはありませんがSTDINに直接パラメータを入れることも可能かも知れません。 回答になってますでしょうか?

nagahaha
質問者

お礼

有り難うございます。 まさに単純に渡すだけでよいのです、 パラメーターも何も不要です。 ただ、 >HTTPヘッダ使って が分からないのです。 実は同じことをperlジャンルで聞いたところ、 同じことを教わりました。 その時にも分からなくて、調べた結果、 javascriptにたどり着いてしまい、 <html> <head> ,,,,,,, location: http://,,,, と書いたところうまく渡せたのですが、 この場合はjavascriptなので、携帯電話では使えず途方に暮れたのです。 そしてもう少し調べた結果、 perlでもこのHTTPヘダーがあるという事は分かったのですが、 実際に動いたのは、 #!/usr/local/bin/perlの直下に書いたときのみでした。 やりたいことは、 cgiXの中で単純にいろいろやりたいことを書き、 最後にcgiYにコントロールを渡せればokなのです。 ということで、 具体的な書き方を教えていただければ嬉しいのですが。 やりたいことがうまく説明できずに申し訳在りません。 いいたいことは、cgiYにコントロールを渡すのですが、 javascriptではなく、perl(cgi)で解決したいのです。 なにとぞ宜しくお願いします。

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

お作りになられている cgi の構成が不明ですが、・・・ その cgi を単なるアプリケーションと捉えて、cigX から直接 cgiY を呼び出す(call) すれば良いと思います。

nagahaha
質問者

お礼

早速有り難うございました。 まさにcallしたいのですが、 具体的にはどうコーディングするのでしょうか。 サブrtnだと &XXXで、これは使っていますが、 callという命令(?)は知りません。 宜しくお願いします。

関連するQ&A

  • 1つのフォームで2つのcgiにデータを送るには

    どうぞよろしくお願いします。 テキストエリアにデータ入力して送信ボタンを押すと、 入力した内容が2つのcgiに送られるというようにしたいのですが、こういったことは可能でしょうか? イメージとしては下記のような感じです。 <form action="CGI名1" action="CGI名2" method="POST"> <inpu type="text" name="text1" size="32"> <input type="submit" value="送信"> </form> 両方の送信結果を別々のウインドウで表示します。 もしformタグでは不可能な場合、何か代換法がありましたらよろしくお願いいたします。

    • 締切済み
    • CGI
  • 1つのsubmitボタンで2つのCGIを呼び出すことは可能ですか?

    今は、htmlで <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <form action="abc.cgi" method="get"> 以下省略 <input type="submit" value="送信"> </form> <form action="xyz.cgi" method="get"> 以下省略 <input type="submit" value="受信"> </form> </body> </html> という感じで書き、2つのボタンで個々に2つのCGIを呼び出していますが、 これをメールの送受信のように、1つのボタンで2つのCGIを呼び出すことは可能なのでしょうか。 教えてください。お願いいたします。

    • ベストアンサー
    • CGI
  • javaからcgiの呼び出し

    htmlタグで <form method="post" action="/cgi-bin/gogo.cgi"> とすると、formボタンでcgiが実行されますが、これと同じことを下記のjavaで実行する方法を教えてください。 <script type="text/javascript" language="javascript"> <!-- function gogo(){ cgi呼び出し } //--> </script> <body> <form method="post" action="javascript:gogo()"> ・・・ <input type="submit" value="送信">

  • javascriptでCGIを実行するには

    htmlタグ <form method="post" action="・・・/cgi-bin/gogo.cgi"> <input type="text" name="name" size="20" value=""> <input type="submit" value="送信"> 上記で送信ボタンを押すとcgi側でnameを受け取れますが、 以下の場合はcgiは動作するのですが、nameを受け取れません、 受け取れる方法を教えてください。 <script type="text/javascript" language="javascript"> <!-- function gogo(){ document.write('<img src="・・・/cgi-bin/gogo.cgi">'); } // --> </script> </head> <body> <form method="post" action="javascript:gogo()"> <input type="text" name="name" size="20" value=""> <input type="submit" value="送信"> </form>

  • CGIで、HTTP エラー 406が出る

    ここで良いのかどうかと迷ったのですが、webサーバを立ち上げて、今までレンタルサーバに入っていたものを移していました。 ところが、今まで動いていたCGIの一部でエラーが発生します。 いろいろ調べた結果下記のような症状があることが解りました。 ----test.cgiここから------ #!/usr/bin/perl print"Content-type: text/html\n\n"; print"ok"; exit; ----test.cgiここまで------ 上の様なCGIを呼び出すのですが、 <form method="post" action="test.cgi"> <input type="submit" value="戻る" name="return"> </form> これで、以下のエラーが出ます ---------------------------------------------- リソースを表示できません 検索中のリソースは、このブラウザで開くことができません。 次のことを試してください: 別のリンク先を表示するには、[戻る] ボタンをクリックしてください。 [検索] ボタンをクリックして、インターネット上の情報を検索してください。 HTTP エラー 406 - 受信不可 Internet Explorer ---------------------------------------------- ただし、nameを使わない場合 <form method="post" action="test.cgi"> <input type="submit" value="戻る"> </form> valueが"更新"の場合、 <form method="post" action="test.cgi"> <input type="submit" value="更新" name="return"> </form> などは正常にcgiを行います。 多分漢字コードがshift-jiだから起こり、httpdに何か設定をしてやれば良いのではないかと思いますが、何をしたら良いのかが解りません。 ただし、諸般の事情によりshift-jisは変更できません。 よろしくお願いします。 FedoraCore4 perl-5.8.6-24 httpd-2.0.54-10.3 インストールは、FedoraCore4のサーバ最小設定でインストールして、後はyumでインストールしました。

  • javascriptからCGIへの値渡し

    cookieは利用しない方向で考えています。 HTML上のdocument.form01.のsubmitが押下されたら一度手入力されたデータ(userinput)を加工し、 別のフォームform02.valueに格納してtest.cgiにPOSTで投げる動作を期待しています。 下記だとページ遷移無しで一時的な格納まで確認しましたが CGIへの送信が機能していないようです。 どの様にすべきでしょうか? [html] <script type="text/javascript"> <!-- function onSubmit() { document.form02.sendform.value = '\"' + document.form01.userinput.value + '\"'; document.form02.submit(); } --> </script> <body> <form name="form02" method="POST" action="test.cgi"> <input type="hidden" name="sendform" value=""> </form> <form method="POST" action="" name="form01"> <input type="text" name="userinput"> <input type="submit" value"送信" onclick="return onSubmit();"> </form> </body> </html>

  • 複数のCGIにデータを渡したい

    現在、2分割のフレームでA.cgi(frame1)とB.cgi(frame2)を表示させています。 <form method=post action="A.cgi" target="frame1"> <input type=submit value="name"> </FORM> でA.cgiにnameが送信された結果がframe1に表示されますが、この1つのボタンクリックで同時にnameをB.cgiにも送信し、結果をframe2に表示させるにはどうしたらいいでしょうか?

    • ベストアンサー
    • CGI
  • 別サーバーのcgiへバイナリデータを送る方法

    サーバーAに、バイナリデータがあります。 これをサーバーBのcgiへデータを渡したいのですが、方法を教えてください。 HTMLで書くと、以下のようにc:\data.binを<form>でcgiに送信するようなイメージです。しかし、<input file>タグではセキュリティーのためvalueでファイルを指定することができません。 ここのc:\data.binは、ファイル名が変動するため、人間に手で選択させることはさせたくないです。 <form action="http://www.サーバーB.jp/Server_B.cgi" enctype="multipart/form-data" method="post"> <input type="file" value="c:\data.bin"> <input type="submit" value="サーバーAに送信"> </form> これを、cgi(Perl)を使用して、同じようなものを書くことはできますでしょうか? httpヘッダを書いて、その後ろにデータを送信して、、といった感じでできるような気がするのですが、 httpヘッダの書き方が分かりません。 受け側のサーバーBのcgiでは、CGI_Lite.pmを使用してバイナリデータを受信します。 通常、バイナリのデータ送信はftpを使用するのだと思いますが、相手側がftpに対応していません。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • ジャバスクリプトを入れるとCGIエラーが出てします。

    下記のような感じでプログラムしてみたのですがどうしてもCGIエラーが出てしまいます。 何か打開策などございましたら教えて頂けないでしょうか?お願いします。 $Head=$Head.qq{ <script> function send(){ //どのラジオボタンがチェックされたか判定 var i; if (document.form_a.r_b.length) { for (i = 0; i < document.form_a.r_b.length; i++) { if (document.form_a.r_b[i].checked) { var ck_b = document.form_a.r_b[i].value; } } } else q{ if (document.form_a.r_b.checked) { var ck_b = document.form_a.r_b.value; } } //チェックされたボタンから遷移先を分ける if(ck_b=="A"){ document.form_a.action="http://www.***.co.jp/cgi-local/J_S001.cgi?ff_flg=2&free=" + document.form_a.KENSAKU.value; document.form_a.submit(); }else if(ck_b=="B"){ document.form_a.action="http://www.***.co.jp/cgi-local/H_S001.cgi?ff_flg=2&day_flg=1&free=" + document.form_a.KENSAKU.value; document.form_a.submit(); } else if(ck_b=="F"){ document.form_a.action="http://www.***.co.jp/cgi-local/SearchJobOffer1b.cgi?ff_flg=2&free=" + document.form_a.KENSAKU.value; document.form_a.submit(); } } </script> };

  • VBAでIEを操作submit処理について

    ExcelVBAでIEを操作する処理について勉強中です。 formで、nameが定義されておらず、submitが複数(4つ)ある場合です。 HTMLが下記記載の場合で、submit”A”をクリックしたいです。 <form action="XXXX/admin.cgi" method=POST><td> <input type="submit" value="A"></td></form> <form action="XXXX/admin.cgi" method=POST><td> <input type="submit" value="B"></td></form> <form action="XXXX/admin.cgi" method=POST><td> <input type="submit" value="C"></td></form> <form action="XXXX/admin.cgi" method=POST><td> <input type="submit" value="D"></td></form> VBAでのsubmitの記述を下記で試してみたのですが、うまくクリックできません。 ObjIE.document.forms(0).Action = "XXXX/admin.cgi" ObjIE.document.forms(0).submit どのように変えたらよいのでしょうか。。。 ご教授お願い致します。

専門家に質問してみよう