アプリ版:「スタンプのみでお礼する」機能のリリースについて

htmlからCGIファイルを呼び出すと、そのCGIは動作はしているようですが、
print等でhtml形式で文字出力させている部分は、ブラウザ内に表示されません。
今やって失敗している方法です。どのようにするのが良いか教えて頂ければ幸いです。

1.CGIスクリプト(Perlで記述)を用意... test.cgi
-----------------------------------------------------
#!/usr/bin/perl
print "Content-type:text/html; charset=shift_jis\n\n";
print <<__EOD;
<html lang="ja">
<head>
<title>TITLE</title>
</head>
<div align=center>
<a>テスト1</a><br>
<a>テスト2</a><br>
</div><br>
</body></html>
__EOD

open(OUT,">a.tmp") || die "$!";
print OUT "aaaaa\n";
close(OUT);
-----------------------------------------------------


2.htmlを用意 ... test.html
-----------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title>HTML TEST</title>
</head>
<body>
<script src="http://xxx/CGI/test.cgi"></script>
</body>
</html>
-----------------------------------------------------

上記のとき、動作として、

◆ブラウザからCGIのパス(http://svr1/CGI/test.cgi)に直接アクセスした場合、
「テスト1」「テスト2」の文字が表示され、a.tmpファイルも作成されている。

◆ブラウザからhtml(http://svr1/test.html)にアクセスした場合、ブラウザ画面は何も表示されない
(真っ白となる)が、a.tmpファイルは作成されている。

のようになってしまいます。

後者のようにして、htmlからCGIファイルを呼び出すと、そのCGIは動作はしているようですが、
print等でhtml形式で文字出力させている部分は、ブラウザ内に表示されません。

以上、よろしくお願い致します。

A 回答 (10件)

<script src="

http://xxx/CGI/test.cgi"></script>としているなら
perlで出力するヘッダーは
print "Content-Type: application/x-javascript\n\n";
としないとならないでしょう。

perlではjavaScript構文を出力します。

例えばhtmlでは・・
<BODY>
<SCRIPT TYPE="Text/Javascript" LANGUAGE="Javascript">
<!--
document.write ("<SCRIPT TYPE=\"text/JavaScript\" SRC=\"test.cgi\"></SCRIPT>");
// -->
</SCRIPT>
</BODY>

として、perlでは

#!/usr/bin/perl
print "Content-Type: application/x-javascript\n\n";
print "document.write('<A HREF=\"other.html\">てすと</A>');";

てな感じです。

この回答への補足

詳しいご説明、ありがとうございました。

今から、教えていただいた方法でテストしてみます。
結果が分かりましたら、また、ご報告に伺います。
取り急ぎ、教えて頂いて、ありがとうございました。

補足日時:2008/12/08 09:33
    • good
    • 0
この回答へのお礼

やってみました。結果的には、htmlの表示が真っ白のままでした。ブラウザ(ie6)の設定にもよるのでしょうか。
最後の*.tmpファイルは、test.htmlをブラウザで読み出すごとに毎回生成されています。

使ったファイルの内容です。
-- test.html -------------------------
<html>
<HEAD>
<title>HTML TEST</title>
</HEAD>
<body>
<SCRIPT TYPE="Text/Javascript" LANGUAGE="Javascript">
<!--
document.write ("<SCRIPT TYPE=\"text/JavaScript\" SRC=\"counter/test2.cgi\"></SCRIPT>");
// -->
</SCRIPT>
</body>
</html>
-------------------------------------

-- test2.cgi ------------------------
#!/usr/local/bin/perl
print "Content-Type: application/x-javascript\n\n";
print "document.write('<A HREF=\"other.html\">てすと</A>');";
#document.writeln('<A>てすと</A>');
$t = $^T;
open(OUT,">$t.tmp") || die "$!";
print OUT "$t\n";
close(OUT);
---------------------------------------
(other.html は実際にはありませんが、ここでは関係ないですよね)
document.writeln なども試してみましたが、同じ結果でした。

継続してお答え頂けるようでしたら、よろしくお願いしたいと思います。お手数をお掛けしてすみません。

お礼日時:2008/12/08 12:46

うーーん、そうですか。

。。
javaScriptの実行を切っていると、こちらではこの現象を確認できるのですが。。。

他のPCのブラウザでも同様の現象なのでしょうか??

こういう言い方は好きではありませんが、(どこかに原因があるとは思いますが)環境依存・・・なのかも知れませんね。

またアクセスカウンターなどでは
- SSIを利用する方法
<!--#exec cgi="./cgi-bin/counter.cgi" -->
- IMGタグを利用する方法
<IMG SRC="./cgi-bin/counter.cgi">
が一般的でしょうか。。
cgi(perl)では「Content-Type image/gif」や「Content-type: image/jpeg」をhttpヘッダーに付加の上、
画像のバイナリを送信してやればよいかと思います。
この場合、必ずしも「SCRIPTタグ」や「javaScript」を使う必要は無いでしょう。

#お力になれず申し訳ありません。
#何か解りましたらまた書き込みます。
    • good
    • 0
この回答へのお礼

ご回答、何度もありがとうございました。
別のCGI/Perlの学習本を入手して読んでいたところ、
教えていただいたような、
「Content-Type image/gif」や「Content-type: image/jpeg」
でのやり方が紹介されていました。

当方、CGIは初めてですが、Perlは 数年来、PG言語として
使っておりまして、なんとか新しい分野に活かせないかなと思い、
html側からは単にCGIをモジュールとして呼び出す簡単な構造で、
CGIの中で処置をガリガリ書くような仕組みに出来たらなという
ところから、質問にあがりました。

何度もお手数をお掛けしており、ひょっとして、まだ何かを調べて
頂いていたかも知れませんが、この件、いったん凍結とさせて頂いて、
もう少し、具体的な質問が出れば、再度上げたいと思います。

ありがとうございました。感謝いたします。

お礼日時:2008/12/10 14:12

現象を確認しました。


javaScriptの実行が無効になっていますね。

「インターネットオプション」の「セキュリティ」タブから
インターネットを選択の上、「レベルのカスタマイズ」ボタンを押してください。
「スクリプト」項目以下の「アクティブスクリプト」が「無効にする」なっているはずです。
「有効にする」を選択するか、問題なければ「リセット」ボタンを押して
「アクティブスクリプト」が「有効にする」となっていることを確認してください。
「インターネットオプション」を終わらせて(ieの再起動は必要なし)、
再度、test.htmlを要求すると期待通りの動きをするはずです。
いかがでしょう???

この回答への補足

何度もすみません、聞いている私の方が書き込みが遅くて恐縮です。
インターネットのセキュリティの設定ですが、ベタですべて書きますと、
・ActiveXコントロールとプラグインの実行=有効
・ActiveXコントロールに対して自動低にダイアログを表示=無効
・スクリプトを実行しても安全だとマークされていないActiveXコントロールの初期化とスクリプトの実行=無効
・スクリプトを実行しても安全だとマークされているActiveXコントロールの初期化とスクリプトの実行=有効
・バイナリビヘイビアとスクリプトビヘイビア=有効
・署名済みActiveXコントロールのダウンロード=ダイアログ表示
・未署名のActiveXコントロールのダウンロード=無効
・Javaの許可=安全性-高
・Javaアプレットのスクリプト=有効
・アクティブスクリプト=有効(になっていました。もともと)
・スクリプトによる貼り付け処理の許可=有効
・IFRAMEのプログラムとファイルの起動=ダイアログ表示
・InternetExplorerWebbrowserコントロールのスクリプトの許可=無効(★)
・UserDataの常設=有効
・Webページが、制限されたプロトコルをアクティブコンテンツに使用することを許可する=ダイアログ表示
・サイズや位置の制限なしにスクリプトでウィンドウを開くことを許可する=無効
・ソフトウェアチャンネルのアクセス許可=安全性-中
・デスクトップ項目のインストール=ダイアログ表示
・ドメイン間でのデータソースのアクセス=無効
・ファイルのドラッグ/ドロップ、またはコピー/貼り付け=有効
・ページの自動読み込み=有効
・ポップアップブロックの使用=有効
・より権限の少ないWebコンテンツゾーンのWebサイトがこのゾーンに移動できる=有効
・暗号化されていないフォームデータの送信=有効
・異なるドメイン間のサブフレームの移動=有効
・拡張子ではなく、内容によってファイルを開くこと=有効
・既存のクライアント証明書が1つ、または存在しない場合の証明書の選択=向こう
・混在したコンテンツを表示する=ダイアログ表示
・ファイルのダウンロード=有効
・ファイルのダウンロード時に自動的にダイアログを表示=無効
・フォントのダウンロード=有効

以上のような設定になっていました。
(★)の設定も有効に変えてやってみたのですが、状況は変わりませんでした。
カスタム設定はもともと「中」でした。→リセットを押してOKとしてからやり直してみましたが、同じでした。。。

補足日時:2008/12/09 15:32
    • good
    • 0
この回答へのお礼

色々と見ていただいて恐縮です。ありがとうございます。

つまるところ、環境設定の問題のようですので、
やはり、今回のような仕組みを作っても、アクセスされる方によっては期待する結果が得られない場合もあるということで、良くない構造という結論でしょうか。

フォルダ名から推察頂けたかと思いますが、今回は、アクセスやダウンロードのカウンタを最終的には実行させて、
その収集結果を、場合によって、異なる表示方法で出力させるようなことをしたかったことになります。
(最初にきちんと説明できずに申し訳ありませんでした)

.cgiを直接アクセスするような仕組み(htaccess)とかにする方が素直でしょうか。
延々と疑問形の結びになってしまいまして、厚かましく申し訳ありません。

お礼日時:2008/12/09 15:47

先ほどレスで頂いたコード(html, perl)を元にテストしてみましたが、


こちらでは問題なくリンクの表示、またtmpの生成も確認しました。
javaScriptの実行を無効にしていませんか??
またブラウザキャッシュをご覧になってませんか??
test.htmlを呼び出す際、念のためCtrl+F5で再表示してしてみてください。

# 連投ですいません。。。

この回答への補足

何度もご丁寧にありがとうございます。
ブラウザ(ie.6/Win-XP)のオプションですが、
・Java(Sun)<applet>にJRE 1.6.0_11を使用にチェック
・Microsoft VMのJava JITコンパイラの使用にチェック
・Javaコンソールの使用がoff
・Javaのログの使用がoff
となっています。

Ctrl+F5を押しても何も表示されない(真っ白なままな)状況は変わりませんでした。
ブラウザの下段枠のステータスバーには、黄色い▲のビックリマークと、「実行しましたが、ページでエラーが発生しました。」が一瞬表示され、
最後に、「ページが表示されました。」のメッセージが出ています。
遅くなりすみません。取り急ぎ、ご連絡しておきます。

補足日時:2008/12/09 09:49
    • good
    • 0

ブラウザから

http://server/counter/test2.cgiを直接呼ぶとファイルダウンロードになろうかと思います。
ファイルをダウンロードしてメモ帳で表示してみてください。
内容に「document.write('<A HREF=\"other.html\">てすと</A>');」の記述があればcgiの出力は問題ないでしょう。
cgiの実行エラーである場合も考えられますが、まずはご確認ください。

この回答への補足

ブラウザ(ie6/Win-XP)のアドレス欄に
----------------------------------------
http://server/counter/test2.cgi
----------------------------------------
を打ち込んで、リターンすると、


----------------------------------------
Content-Type: application/x-javascript document.write('てすと');
----------------------------------------
と表示されました。てすとの文字部分は、ハイパーリンクになっていて、
counter/other.html を指しています。

このとき、ブラウザで「表示」→「ソース」とすると、

----------------------------------------
Content-Type: application/x-javascript

document.write('<A HREF="other.html">てすと</A>');
----------------------------------------
がメモ帳で見えています。

補足日時:2008/12/09 09:54
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。遅くなりました。
どうも、何か私の環境の設定が良くないようですね。
そのことは、つまり、今回の仕組みを作っても、
実行される環境によっては期待する結果が得られないことが
あるということになりそうです。

ただ、今回、意図した動きにならない根本原因について、もし分かれば幸いです。
お時間ございましたら、よろしくお願い致します。

お礼日時:2008/12/09 09:58

HTMLから scriptタグで cgi をコールして、cgiスクリプトから出力した文字列を表示させるのなら、cgiスクリプト側から、表示させたい文字列を、


  document.writeln('表示させたい文字列')
というように、javascriptの構文で出力してやらないといけません。
ただし、文字列の内容によってはエスケープする必要があります。
    • good
    • 0
この回答へのお礼

事務局から連絡で、投稿規制に抵触があったとのことです。
(ご回答原文改訂されたとのことでした)
申し訳ございませんでした、あらためて、お礼させて頂きます。
ご回答ありがとうございました。

お礼日時:2008/12/10 14:15

回答 No.4:joker_mk2 さんへ。



良い回答ありがとうございます。

私自身 回答No.2で「CGIなどWebサーバ上で動作するサーバサイドスクリプトを実行するタグではありません」と書きながら,
「実はtest.cgiは実行されている(a.tmpが作成されたのがその証拠)。この場合のJavaScriptの入手先は静的ファイルの *.js じゃないんだ」と言えなかったことが気がかりでした。
No.4のように説明すればいいのですね,たいへん参考になりました。
    • good
    • 0

とっても、おかしいです。


<script>は
Scripts in HTML documents (ja)
http://www.asahi-net.or.jp/%7Esd5a-ucd/rec-html4 …
で、スクリプトであることを示す要素ですよね。

cgiから出力されているのはスクリプトですか????
    • good
    • 0
この回答へのお礼

大変参考になるページをご紹介頂いて、ありがとうございました。

実際には、私が最初に書いた例文の冒頭、
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
については、CGI学習本の一部を参考に書いただけのもので、
意味すら分かっていませんでした。

cgiでは、htmlの構文を吐き出して、その内容を親(と呼んで良いか定かではありませんが)html内に取り込んで、
その親html内の一部として表示させたかったのです。

お礼日時:2008/12/08 09:30

<script>タグは,JavaScriptなどWebブラウザ上で動作するクライアントサイドスクリプトを実行するタグであり,CGIなどWebサーバ上で動作するサーバサイドスクリプトを実行するタグではありません。



もし仮に,質問者のイメージしている(だろう)ことができたとしても,生成されるHTMLは次のように,間違った入れ子になってしまうのではないですか。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title>HTML TEST</title>
</head>
<body>
  Content-type:text/html; charset=shift_jis
  
  <html lang="ja">
  <head>
  <title>TITLE</title>
  </head>
  <div align=center>
  <a>テスト1</a><br>
  <a>テスト2</a><br>
  </div><br>
  </body></html>
</body>
</html>

質問者は何がしたいのでしょう?
Web利用者には .cgi であることを知らせたくない,Web利用者からは .html にしか見えないが 実は Webサーバ側では CGI でHTMLを生成している,そういう環境を作りたいということでしょうか。
    • good
    • 0
この回答へのお礼

ご回答遅くなり、すみませんでした。まだCGIというものも勉強中の身で、それほど深く考えていたわけではなく、
出来れば、ブラウザではhtmlのページを選択させておいて・・・
ああ、つまり、おっしゃって頂いた
「Web利用者からは .html にしか見えないが 実は Webサーバ側では CGI でHTMLを生成している」
ということをしたかっただけでした。

それで実際は、示して頂いたような変な状況になってしまうのですね。
お手数をお掛けいたしました。

お礼日時:2008/12/08 09:26

もし以下のように記述されていた場合、srcで指定された内容がブラウザに表示されると思いますか?


<script src="http://xxx/test1.js"></script>

最終的にどのようなものを要求しているか解らないのでこれ以上のアドバイスはできません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
お礼が遅くなりすみません。
また、質問が的を射ておらず、伝わらなかったようです。
CGIを直接ブラウザから呼んでも、htmlの中にCGI呼び出し部分を書いて、そのhtmlをブラウザから呼んでも
CGIが吐き出す結果を同じように画面に表示させたかったのでした。

お礼日時:2008/12/08 09:21

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