Ajax&CGIについての質問

このQ&Aのポイント
  • Ajaxプログラムを作成している際の問題について質問させて頂きます。
  • サーバ側でのCGI処理でエラーが発生し、サーバー内部エラーが表示されます。
  • Apacheの設定で拡張子.plをCGIとして扱わない設定にしても、処理結果ではなくソースが表示されてしまいます。原因や解決方法について教えてください。
回答を見る
  • ベストアンサー

Ajax&CGI

Ajax勉強中の者です。 勉強のために簡単なAjaxプログラムを作成しているのですが、早速上手くいかず困っているので質問させて頂きます。 ※ソース等は手元にないのであまり詳しい状況は説明できないかもしれませんが・・。 実現したいことはテキストボックスがあり、そこにIPアドレスを入力しボタンを押すとサーバへ入力した値を送信し、サーバ側では送信された値を受け取りいろいろ処理をした後にクライアントへレスポンスし、クライアントで表示する みたいなことをやりたいのですが(説明下手ですみません・・)。 サーバ側はCGI(Perl)で作成しており、処理は簡単に説明するとクライアントから受け取ったIPアドレスでPingを打ってその結果をクライアントへ返すみたいな感じなのですが、上手く動作せず困っています。 PerlではNet::Pingモジュールを使ってIPアドへPingを実行しています。エラーの内容ですがXMLHttpRequestのstatusは500(サーバー内部エラー)となっており、”エラーを特定できません”と表示されます。 使用しているWebサーバはApacheですがこれは自分がテスト用PC(Linux)へインストールしたもので、もしかしたらサーバ構築に問題があるのかなぁ~なんて不安にもなっています。 テキストボックスに入力したIPアドをサーバで受信し、ブラウザにAjaxで”入力されたアドレスは~です”と表示させたりは動作したのですが・・。 また、Apacheの設定で拡張子.plをCGIとして扱わないようにすると(httpd.confファイルのAddHandlerへ.plを追記しない)サーバの処理結果でなくソースが丸ごと表示されてしまい困っています・・。 ただ拡張子.plをCGIとして扱うと処理結果がレスポンスされます。 この現象についてもどなたか原因を説明して頂けると感謝です。 原因&解決方法など分かる方はぜひご教授ください。 よろしくお願い致します。

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

  • ベストアンサー
回答No.2

#1です。 補足への回答 > 同一ホストって ホストと言う言葉でちょっと混乱しましたね。ドメイン名の事になります。 www.hogehoge.com/aaa.htmlと言うページからXMLHttpRequestで取得出来るのはwww.hogehoge.com内のファイルのみ、と言う事ですね。XMLHttpRequest+クロスドメインで検索してみて下さい(Flashをプロキシとして使った回避方法や、JSONP等を利用する方法もあります)。 > ただ、テキストボックスに入力したIPアドをサーバで受信し、ブラウザにAjaxで”入力されたアドレスは~です”と表示させたりは動作したので単純にXMLHttpRequestは正常に動作していると考えていいものなのでしょうか・・。 この文面からすると、2.3.4,は多分問題無いでしょうね。 500番のInternal Server Errorなので、1.のCGIが正常に動いていないと言う事でしょうね。質問はAJAX&CGIですが、AJAX関連の話は頭から切り離して考えましょう。 CGIの記述か、Apacheの設定に誤りがあります。 この辺が参考になるかもしれません。 http://allabout.co.jp/internet/cgiperl/subject/msubsub_330-10.htm CGIが他のサーバで問題なく動いていたと言う事でしたら、ファイル行頭のperlへのパスが怪しいですね。あとはモジュールのインストール等。 確認して下さい。

msak777
質問者

お礼

回答ありがとうございます。 自分もPerlのモジュールかApacheの設定が疑わしいと思っているのですがCGI(Perl)はサーバ上で単体で実行すると上手く動作します。 IPアドレスをソースに直接書いて実行するとちゃんとperlモジュールも動作し、期待通りの動作をしてくれます。 Perlへのパスはwhich perlコマンドで表示されるパスを一行目に記載してますので特に問題ないと思います。 URLを参考に勉強してみたいと思います。 親切な対応ありがとうございます。

msak777
質問者

補足

http://allabout.co.jp/internet/cgiperl/subject/msubsub_330-10.htm←このページを参照し、CGIのエラーをブラウザに表示させてみたら"icmp ping requires root privilege "と表示されました。 ちょっと調べてみたらNet::Pingはroot権限が必要とのことです..。 CGIでNet::Pingは使用できないものなのでしょうか・・ 今回はAjaxは特に問題なかったようです。

その他の回答 (1)

回答No.1

だいぶ混乱している感じですね。 AJAXと言っても別に特別な事をしている訳ではなく、せいぜい簡易ブラウザの役割をしている程度に認識していた方が間違いがありません。大概の事はiframeで代替出来ます。 問題を切り分けて見てください。 1. CGIは正常に動いていますか?  AJAXではなく、通常のformでブラウザからPOST または GETで変数を送信し、返り値を確認してみてください。期待通りのものが出たらOKです。 2. CGIのホストとJavaScriptを実行するホストは同一ですか?  XMLHttpRequestの仕様上、同一でなければなりません。 3. JavaScirptのXMLHttpRequestのソースは正常に動いていますか?  CGIではなく、静的ページ(hogehoge.html)を読み込んで確認してみてください。 4. 送信プロトコルはGETですか、POSTですか?  POSTの場合、リクエストヘッダーにapplication/x-www-form-urlencoded をつける必要があります。大丈夫ですか?  http://itpro.nikkeibp.co.jp/article/COLUMN/20060607/240192/ だいたいこの辺をチェックすれば原因がつかめると思います。 > Apacheの設定で拡張子.plをCGIとして扱わないようにすると 当然です。1.でちゃんと動くのでしたら原因はほかにあります。 がんばってください。

msak777
質問者

補足

親切な回答ありがとうございます。 指摘された通りに動作テストをしてみます。 4.の送信プロトコルはGETですがURL参考になりました。 あと初歩的な質問で恐縮ですが、2.の同一ホストって特に意識せず作成してますが具体的にどういうことでしょうか?同一ホストって同じホスト名という意味ではないですよね・・。 ただ、テキストボックスに入力したIPアドをサーバで受信し、ブラウザにAjaxで”入力されたアドレスは~です”と表示させたりは動作したので単純にXMLHttpRequestは正常に動作していると考えていいものなのでしょうか・・。

関連するQ&A

  • Ajax⇒CGI

    JavaScriptは結構知ってますが、 AjaxとPerlに関しては初心者のものです。 早速ですが質問です。 Ajaxで送信したデータをCGI(Perl)で処理して、 サーバーのテキストに保存する方法が良く分かりません。 サーバーはCGIを許可しているところを使っています。 どなたか詳しい方、ご教授お願いします!

  • 「SubmitせずにAjaxからCGIを呼び出して結果をHTML上に表

    「SubmitせずにAjaxからCGIを呼び出して結果をHTML上に表示したい」 HTMLファイル上にテキストボックスとそれと対になるラベル(ラベルじゃなくても良いのですが。。)のセットがいくつかあります。 テキストボックスにコードを入力したら、ラベルにそのコードに対応する商品名を表示したいと思っています。 テキストボックスにコードを入力後、フォーカスが離れたら(Onchangeで)Ajaxでそのコードの値を取得し、そのデータをCGIに渡してサーバにあるDBに接続し、その結果をHTML上のラベルに表示したいと思います。 Sbmitせずにフォーカスが離れた場合に、データをCGIに受け渡し、そのデータを画面遷移しないで、HTML上に表示するのはどのようにすればいいのでしょうか。 Ajaxを使えばいいと教わったのですが、色んなサイトを調べてみたのですが、Ajaxが初心者で、よくわからず、コードなどございましたら教えて頂けましたら嬉しいです。 よろしくお願い致します。

    • ベストアンサー
    • AJAX
  • Ajax.Requestについて

    いつもお世話になっております。 今回はAJAXについてお聞きしたいです。 現在prototype.jsを使って同期通信をしようとしています。 リクエスト部分のソースは以下のようです。 function AjaxLoad() { new Ajax.Request('abc.cgi',         {         method : 'post',         asynchronous : false,          }         ) response = transport.responseText; hyouzi(response); } abc.cgiというものは処理をして値を返すcgiです。 同期通信したのちにその返された値をhyouzi();で使いたいです。 ここでこのAjaxLoad()を呼び出すとtransportはありませんというようなerrorが出ます。 それ以前にabc.cgiを呼んでいるような感じがしません。 上記のような処理をしたい場合はどのように記述すればよいのでしょうか? ご教授願います。

  • CGIとJavascriptの違いについて

    Javascriptの初心者です、宜しくお願いします。 CGIでは「クライアントがサーバーに処理要求を出してサーバーが処理をし、クライアントにhtmlを返す」。 Javascriptでは「クライアントがサーバーに処理要求を出すが、サーバーは処理をしないで、クライアントにhtmlを返してサーバーが処理をして、ブラウザが表示させる」 と本には書いています。 CGIの場合、(1)サーバーからクライアントに返すhtmlとは、具体的にはどのような内容のものでしょうか。htmlファイルという意味でしょうか。(2)またサーバーがする処理とはどのようなものでしょうか。 また、Javascriptの場合、(1)サーバーの役割とはどのようなものでしょうか、(2)サーバーから返されるhtmlとはどのようなものでしょうか、CGIと同じ内容なのでしょうか。(3)この時のブラウザの役割、作業はCGIとはどのように違うのでしょうか。 以上、宜しくお願いします。

  • ApacheでのCGIについての質問

    今Apacheを使っているのですが、 サポートにしたがってfirst.plで動作確認もしたのですが、どうしてもInternal Server Error になってしまいます。エラーログを 見てみますと [Sun Apr 18 11:54:57 2004] [error] [client 127.0.0.1] couldn't spawn child process: c:/program files/apache group/apache/cgi-bin/first.pl と出ています。どなたか解決策をご存知の方が いらっしゃいましたらよろしくお願いします。

  • 無料配布の郵便番号自動入力cgiのデータ更新

     cgiやplファイルは殆ど触ったことがないので、わかりやすく教えていただけると助かります。  今、入力フォームをhtmlで作成しており、郵便番号から住所を自動入力させるAjax利用のフリーサイトを見つけたのですが、郵便番号の更新手順がわかりません。 http://www.kawa.net/works/ajax/ajaxzip2/ajaxzip2.html#download 上記URLに郵便番号辞書のアップデート手順があるのですが、具体的にどのように行ったらよいのかわかりませんので、教えていただけると大変助かります。 「サーバ上でなくても、Windows 環境(ActivePerl)や Mac OS X クライアントでも csv2jsonzip.pl は実行できそうです。」とありますが、当方はサーバ上ではなく、Windowsクライアントです。

    • ベストアンサー
    • Perl
  • ajaxの使いどころ

    現在、会員制のWebサービスを作成しています。 まだ初期段階ですが、今は管理者用のユーザー管理ページに着手しており、サーバーサイド、クライアントサイド合わせて、およそ7割程度完成しているいるところです。 このページの現時点での実装では、ユーザーの削除、復活、パスワードリセット、登録情報の変更、新規ユーザーの登録といった全機能でajaxを使っています。 また、処理対象のユーザーは一覧のテーブルをクリックして選択するのですが、このクリック時にサーバーからユーザーの詳細情報を取得しており、ここでもajaxを使っています。 要するに、1ページ取得したあと、そのページ内でサーバーと通信を行う必要が生じたら、それはすべてajaxを使うという決まりです。 そこで、ajaxの運用についていくつかわからない点があり、質問させて頂きます。 (1) 会員専用ページという性質を考えると、ajaxでリクエストを送信した際にも、サーバーサイドではそのリクエストに対するセッションが有効かどうかをチェックする必要がありますよね? 一般的な会員向けWEBサービスでは、"ページ遷移毎"だけでなく、"ajaxでの通信毎"でもセッションのチェックを行うものなのでしょうか。 (2) ajaxでの通信時にセッションの有効性をチェックした結果、すでにタイムアウト等でセッションが無効な場合、一般的にはどうするべきなのでしょうか。 個人的にはlogoutページにリロードしたいと考えているのですが、このようにするには、サーバー側がレスポンスを返すときに、{error:{code:'1',message:'session_out'}}のようなJSONを返して、それをjavascript側で確認し、location.hrefを書き換える、というような流れで処理を行うことになるのでしょうか。 (3) そもそも、今回のように「1ページ内で生じるサーバー間通信は全てajaxで補う」という考え方は、一般的なものなのでしょうか。 なにが言いたいかというと、"セキュリティ等を考慮してajaxを使うべきではない処理"と"ajaxを積極的に使うべき処理"(もしくは、"ajaxを使っても差し支えない処理")の判断の仕方、つまり、ajaxの使いドコロがよく分かっていません。 以上3点につきまして、ご教授いただければ幸いです。

    • ベストアンサー
    • AJAX
  • cgi環境変数の変更方法?

    cgi環境変数の変更方法? perlで書かれたcgiプログラムがあります。 そのcgiではcgi環境変数内のREMOTE_ADDRを読出し、特定のIPアドレス【特定の端末】であれば特別処理を行っております。 今回、別の端末【別のIPアドレス】から同じ特別処理をする必要が生じました。 サーバ側のcgiプログラムを修正すれば簡単なのですが、著作権上の問題があって出来ません。 そこで端末側のプログラムがC#のWebClientクラスを使用してサーバと交信しているのを幸いとして myClient.Headers.Set("REMOTE_ADDR", "xxx,xxx,xxx,xxx"); ← 従前のIPアドレスへの変更 のステートメントを追加して強制的にIPアドレスを変更しようとしました。 ところがサーバ側のcgi環境変数には、HTTP_REMOTE_ADDRという新しい要素が加わっただけであり、目的とするREMOTE_ADDRを修正出来ません。 調べてみると、apacheがHTTP_タグを追加しているとのことです。 この追加をやめさせREMOTE_ADDRに当方が望むIPアドレスを設定することは可能でしょうか?

  • CGIの引越しが上手くいきません

    さくらレンタルサーバ・ライトの古いホームページから 同じサーバの新しいホームページに メールフォームを移動させました。 ページは表示されるのですが、メールの送受信が出来ない状態です。 同じレンタルサーバなので、変えたのはform.cgiファイルの中の ホームページアドレスのみです。 以下がファイルの一覧です。 cgi-binフォルダの中 (1)cgi-lib (PLファイル) (2)form (CGIファイル) (3)jcode (PLファイル) それ以外のファイル mail.html (送信後に表示するページ) top.html (メールフォームのページ) style.css ホームページアドレス以外に変える部分があるのだと思いますが、 それがどこなのか見当がつきません。 どなたかお分かりになる方がおられましたらご指摘をお願いします。

  • jqueryMobileがAjax?

    Ajaxという単語の意味がわからなくなりました… jqueryMobileの様々な解説をみているとページ切り替え時とかにAjaxによってとかいう表現が出てきますが、jqueryMobileは既にサーバーから取得したHTMLをjavascriptで表示切り替えしてるだけで、各ページの情報を適宜サーバーから取得しているというわけじゃないと思います。 Ajaxの定義はjavascriptを用いてページ遷移をすることなくサーバーと通信すること、と思っていたので、このjqueryMobileのAjaxという単語の使い方に違和感を覚えます。 jqueryMobileの解説でのAjaxって単語の使われ方は正しいんでしょうか? それともjqueryMobileは実際はクライアントサイドでの表示切り替えだけでなくサーバーとの通信を行ってるんでしょうか? 参考 http://dev.screw-axis.com/doc/jquery_mobile/components/pages_dialogs/page_links/

専門家に質問してみよう