cgiからcgiを呼び出す方法
- perlのcgi製作を始めて7日目の素人で恐縮ですが、cgi Aに対して新たにcgi Bを作成し、cgi Bからcgi Aを呼び出したいですが、うまくいきません。
- 試した例として、exec関数や<!--#exec cgi-->タグを使用しましたがうまく動作しません。
- Apacheをローカルにインストールし、cgi Bの認証フォームでコードを入力してDB内のデータと一致した場合にcgi Aを呼び出したいですが、正常に動作しません。
- ベストアンサー
cgiからcgiを呼び出す方法
perlのcgi製作を始めて7日目の素人で恐縮ですが、教えてください。 タイトルのキーワードで検索し、いろいろ試しておりますがうまく動作しません。 ■試した例 exec("./cgi A.cgi") <!--#exec cgi="./cgi A.cgi"--> もともと単体で動作していたcgi Aに対して新たにcgi Bを作成し、 cgi Bからcgi Aを呼び出したいのですが、うまくいきません。 cgi A:アンケート回答フォームのようなもの cgi B:認証フォーム(コードを入力してDB内のデータと一致したらcgi Aを呼び出したい) 自分のPCにApacheをインストールし、ローカルで実行しております。 cgi Bはcgi Aを呼び出す部分をコメントアウトすれば動作します。 どなたか良きアドバイスをよろしくお願いします。
- crescentmonkey
- お礼率100% (7/7)
- CGI
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> exec("./cgi A.cgi") > <!--#exec cgi="./cgi A.cgi"--> これ、何を意図したものですか? ./cgi ってなんです? この書式だと、 ./cgi(カレントディレクリのcgiというコマンド)に A.cgi を引数にして実行しようとします。おそらく、cgiなんて実行ファイルや命令は無いでしょうから失敗するでしょう。 方法としては次のものが考えられます。 ・正しく A.cgi を実行する PCでApache使ったことないので、どうなるか確認取ってませんが、 A.cgi が単独で実行できるなら exec("A.cgi") ; あるいは、Perlコマンドを指定して exec("perl A.cgi") ; A.cgiにパラメータを渡すなら、仕様にしたがって。 あと、httpのヘッダが重複しないように注意。 ・ location や refresh を使って、 A.cgiのURLへリダイレクトする。
その他の回答 (1)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2281)
system('A.cgi'); または `A.cgi`; このことでしょうか? HTML、CGI、Perl、SSIはそれぞれ別物ですから、 それぞれの区別を付けて置いた方が良いです。
お礼
コメントありがとうございました。 状況に変化があったので新たな質問を立てさせていただきました。
補足
記述がへたくそですみません。 ご推測の通りです。 何かアドバイスを頂けると幸いです。 宜しくお願いします。
関連するQ&A
- cgiからcgiを呼び出す方法2
先日「cgiからcgiを呼び出す方法」で質問させていただいたのですが、 その後の状況にて新たな質問をさせていただきます。 【経緯】 もともと単体で動作していたcgi Aに対して新たにcgi Bを作成し、 cgi Bからcgi Aを呼び出したいのですが、うまくいきません。 cgi A:アンケート回答フォームのようなもの cgi B:認証フォーム(コードを入力してDB内のデータと一致したらcgi Aを呼び出したい) 【その後の状況】 exec("perl A.cgi"); とすることで cgi A の画面を表示することが出来ました。 【新たな質問】 (1) cgi A の画面は表示されましたが title は cgi B のままです。 exec で cgi A が呼び出された時点で title は cgi A にならないのでしょうか? (2)いろいろなサイトに、呼び出し先に "Content-Type: text/html; charset=Shift_JIS\n\n" の記述があってはダメとの説明がありましたが、この記述がないと cgi Aにてデータを入力し、送信ボタンを押すと 500 Internal Server Error(malformed header from script. Bad header~) が表示されてしまいます。 Content-Type の記述があれば、cgi A の送信ボタンを押すことによって 入力したデータがDBに格納され、また、title も cgi A のタイトルが表示されます。 【cgi A が呼び出された時点の画面イメージ】 cgi B のタイトル Content-Type: text/html; charset=Shift_JIS cgi A のタイトル cgi A の入力項目 cgi A の送信ボタン cgi A の送信ボタン(submit)を押すことによって、完全に cgi Aに制御が渡るということでしょうか? cgi A を呼び出した時点で完全に cgi A に制御を渡したいのですが、 どなたかアドバイスをお願いします。 cgi A の構成を変える必要があるようであれば、その当たりのアドバイスもお願いします。
- ベストアンサー
- CGI
- 二つのcgiが干渉しあうのですが・・・
cgi初心者です。よろしくお願い致します。 アンケートフォームを二つ作成して、そのフォームを通して、それぞれのcgiが動作するように、cgi-binのフォルダに二つそれぞれファイルにフォームとcgiを設置しました。 最初に作ったAというフォームはキチンとcgiが動作し、sendmailも設定のところに、設定したレイアウトで返信されてくるのですが、それが、何故か次にAを改造したBを動作させると、sendmailは違うアドレスを設定しているのにもかかわらず、Aのアドレスへ送りつけ、なお且つAのフォームのレイアウトで返信されて来ます。 一体どうして、このようなことが起こるのかわかりません。考えられる事、どんな小さなことでも構いません。アドバイスをいただければと思います。 よろしくお願い致します。
- ベストアンサー
- CGI
- サーバーAでcgiで認証し、サーバーBへ飛ばす
サーバーAでcgiでユーザーIDとパスワードで認証し、サーバーBの一般からアクセスされたくないURLに飛ばす方法を教えてください。 サーバーB側で、どのような受け口を作ればよいのかで悩んでいます。 cgi(Perl)のスキルと、Apacheのスキル少々です。 ヒントだけでもいただけましたら後は勉強します。 (1),サーバーAで、cgi(Perl)を使用してユーザー認証します。 (2),認証OKの場合、cgiからサーバーBへリダイレクトします。 (3),サーバーBでは、上記の認証OKのアクセスだけを許可します。 サーバーBには、htmlやpdfなどを置いています。 これを、.htaccessのREFERER認証を使用して、サーバーAのREFERERを持ったものだけを 通す設定にしてみました。 この場合、最初に呼んだhtmlは表示されますが、そのhtmlからimgタグで呼んだ画像などは 表示されません。 また、そのhtmlから同じディレクトリ内の他のhtmlへ飛ぶこともできません。 特にREFERER認証に拘りません。何か良い方法はありませんでしょうか。
- 締切済み
- ネットワーク
- CGI:method="post"でもGETになる
CGIで標準入力によりフォームデータを取得できないため、環境変数%ENV内の値を 調べましたところ、入力フォーム(html)のformタグでmethod="POST"と明示しているにも 拘らず、REQUEST_METHODの値がGETになっており、POST用のCONTENT_LENGTHも GET用のQUERY_STRINGも共に空になっております。 htmlでmethod="GET"と指定した場合には、REQUEST_METHODの値は正しくGETになり QUERY_STRINGからフォームデータを取得できます。 同じCGIをPC上のApache2.4でテストした結果、REQUEST_METHODはhtmlのmethod=~で 指定した通り正しくPOSTまたはGETとなり、それぞれフォームデータを 取得できることを確認いたしております。 この点についてプロバイダに問合せいたしましたが、サポート対象外ということで、 回答を得ることができませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただけないでしょうか、お伺いいたします。 (1)ホスト動作環境 a.CGIサーバ:Apache b. perl 5.10系 (2)PC動作環境 a.OS: Windows 7 b.ブラウザ: Internet Eexplorer 11 c.CGIサーバ: Apache 2.4 d. Activeperl 5.20
- 締切済み
- CGI
- CGIを開けない。。。
apacheとphpを設定して動作確認したあとに、cgiも操作したいので、Active Perlというものをインストールしてみました。 phpは、http://localhost/で「C:/Program Files/Apache Software Foundation/Apache2.2/htdocs」のフォルダーを参照できるのですが、cgiを開くときには、どこのフォルダーに格納し、URLをどうすれば宜しいのでしょうか?(因みにcgi-binとhtdocsに格納し、http://localhost/***.cgiで試したのですが駄目でした。) Active Perlインストール後に変更した場所 ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/" <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin"> AddHandler cgi-script .cgi .pl なお、perlの設定には、こちらhttp://www.jisaba.net/xp/actpeal/04.htmのサイトを参考にしました。 環境はWindowsVistaです。 どなたか宜しくお願い致します。
- ベストアンサー
- Perl
- CGIのパス(Apache winで)
初歩的な質問ですみません。 環境 windows2000 サーバー Apache/1.3.20 ActivePerl-5.6.1.626 をインストールが完了して、CGIを動作させようとしています。 ApacheでのHTML動作はできています。 CGIプログラムの一行目に #!/usr/local/bin/perl と記載されています。 その文字列を #!c:/bin/perl.exe に変更して現在動作させています。 しかし、ISPのHPスペースのperlへのパスは #!/usr/local/bin/perl なので、転送前に一行目を変更しています。 変更しなくても良いように ApacheでのCGIのパスを #!/usr/local/bin/perl で動作する方法を どなたか教えていただけないでしょうか? ちなみに Perlは[c:\bin]にインストールしてあります。 Apacheは[g:\apache]にインストールしてあります。
- ベストアンサー
- その他(インターネット接続・通信)
- CGIでフォームデータを取得できません
CGI(perl)の標準入力についてお伺いいたします。 PC上でテストし動作を確認したCGIをプロバイダのCGIサーバに移植しましたが、 正常に実行終了するものの、標準入力によるフォームデータの取得ができません。 フォームデータを受け取る変数が空になってしまいます。 PCとプロバイダのCGIサーバとでは、CGIスクリプトの記述方法が異なるのでしょうか。 書籍、ネットをだいぶ調べましたが、解決策が見当たりませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただきたいです。 (1)PC動作環境 a.OS: Windows 7 b.ブラウザ : Interne Eexplorer 11 c.CGIサーバ: Apache 2.4 d.perl : Activeperl 5.20 (2)CGIスクリプト(標準入力の部分) 尚、フォームでは、method="POST"を指定しております。 # フォームデータの取得 if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; }
- 締切済み
- CGI
- 自前サーバでCGIを~
まずはLAN内だけで掲示板などのCGIを実行できるようにしてみよう、ということでApacheを使ってCGIの設定をしているんですが、ブラウザからCGIファイルを起動してもInternal Server Errorと出てしまいます。よってそれ以前ということで・・・ コマンドラインから「perl test.cgi」のようにCGIファイルを実行してみるとちゃんと動作するんですが、「type -a perl」で検索したフルパスをそのままCGIファイルに「#!/usr/bin/perl」などのように書いても、ファイルがコマンド化されてくれません。でも、perlの実行ファイルは存在していました。 これは、どうすれば解決できるのでしょうか?
- ベストアンサー
- その他(インターネット接続・通信)
- Perlを実行する方法
Perlを実行するために <?php $ret = exec('/usr/bin/php /usr/local/apache/public_html1/testdir/a.cgi'); print $ret; ?> のように書きましたが、a.cgiは実行されないし$retは空白でした。 execでなくてもよいのですが、普通はPHPの実行中に、ある処理をさせるa.cgiを実行させるにはどうしているんでしょうか? a.cgiの処理が終わるまでphpのprint $ret;のステートメントの実行は待ち状態で、a.cgiの処理結果がTRUEなのかFALSEなのかを得られればさらによいです。
- 締切済み
- PHP
お礼
コメントありがとうございました。 リダイレクトというキーワードで新たな知識を得ることが出来ました。 また、状況に変化があったので新たな質問を立てさせていただきました。
補足
記述がへたくそですみません。 ご認識通り正しくはexec("A.cgi") ;です。パラメタは無しです。 単純にA.cgiに制御を渡したいのみです。 具体的にはexec("./test.cgi");と記述しておりましたが、 試しにexec("test.cgi");で実行したところ、 IEが待機中のまま返ってこなくなりました。 あと、 >httpのヘッダが重複しないように注意。 >・ location や refresh を使って、 A.cgiのURLへリダイレクトする。 この点を掘り下げて教えていただけると幸いです。 宜しくお願いします。