プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
分からないならではの質問かと思いますが、
標題の通りです。

cgiXの中からcgiYを呼び出したい(コントロールを渡したい)
のです。
どう考えればよいのでしょうか。

これまでは、formのactionにcgi名を書き、
submitによってコントロールを渡してきました。

submitせず単純にコントロールを渡したいのです。
宜しくお願いします。

A 回答 (7件)

また具体例忘れてました。


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

何回もまことに有り難うございます。
解決しました。

全ていわれていることは理解できたのにうまくいかないので、
一から見直しましたところ、
print "Content-type: text/html\n\n";
が冒頭に入っていました。

これを各rtnに移したところ、あっけなく解決してしまいました。
大変お世話になりました。
(昨日当サイトのメンテのためにお礼が遅くなりました)

お礼日時:2008/04/17 06:14

お察しの通りです。


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

本当にすいません。


誤解のないようにもうちょっと具体的に書きます。
↓↓↓↓↓↓↓↓↓↓↓↓↓この下から
#!/usr/local/bin/perl

## ここにあなたの処理:ただしprint文など表示系の命令は一切無し

## 最後にこれ↓
print "Location: ./cgiY.cgi\n\n";
↑↑↑↑↑↑↑↑↑↑↑↑↑この上まで
以上です。
    • good
    • 0
この回答へのお礼

何回も有り難うございます。
ここが問題でして。

>#!/usr/local/bin/perl
 これはcgiの全く頭(1行目)ですよね、

>## ここにあなたの処理:
 ここが問題です、
 具体的にはここにデータの吐き出しを書いています。

>ただしprint文など表示系の命令は一切無し
 データの書き出しはありませんが、
 サブrtnでhtmlは書き出しています。
 これが駄目なのでしょうか。

>print "Location: ./cgiY.cgi\n\n";
 これがそのまま出て(表示)されてしまいます。
 
やはり、直下にないというのが原因でしょうか。
しつこくて済みません、
宜しくお願いします。

お礼日時:2008/04/15 10:48

たびたびすいません。


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

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:」なのです。
こんな感じでわかります?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/04/15 10:43

単純に渡すだけなら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に直接パラメータを入れることも可能かも知れません。

回答になってますでしょうか?
    • good
    • 0
この回答へのお礼

有り難うございます。
まさに単純に渡すだけでよいのです、
パラメーターも何も不要です。
ただ、
>HTTPヘッダ使って
が分からないのです。
実は同じことをperlジャンルで聞いたところ、
同じことを教わりました。
その時にも分からなくて、調べた結果、
javascriptにたどり着いてしまい、
<html>
<head>
,,,,,,,
location: http://,,,,
と書いたところうまく渡せたのですが、
この場合はjavascriptなので、携帯電話では使えず途方に暮れたのです。

そしてもう少し調べた結果、
perlでもこのHTTPヘダーがあるという事は分かったのですが、
実際に動いたのは、
#!/usr/local/bin/perlの直下に書いたときのみでした。

やりたいことは、
cgiXの中で単純にいろいろやりたいことを書き、
最後にcgiYにコントロールを渡せればokなのです。

ということで、
具体的な書き方を教えていただければ嬉しいのですが。

やりたいことがうまく説明できずに申し訳在りません。
いいたいことは、cgiYにコントロールを渡すのですが、
javascriptではなく、perl(cgi)で解決したいのです。

なにとぞ宜しくお願いします。

お礼日時:2008/04/14 21:41

お作りになられている cgi の構成が不明ですが、・・・



その cgi を単なるアプリケーションと捉えて、cigX から直接 cgiY を呼び出す(call) すれば良いと思います。
    • good
    • 0
この回答へのお礼

早速有り難うございました。
まさにcallしたいのですが、
具体的にはどうコーディングするのでしょうか。

サブrtnだと &XXXで、これは使っていますが、
callという命令(?)は知りません。

宜しくお願いします。

お礼日時:2008/04/14 14:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!