ちょっと変わったマニアな作品が集結

CGIでソースがそのまま表示されてしまうのですが、どうしてなのでしょうか?

先週からCGIやPerlを学び始めました。そこで簡単なものを試しに作ってみたのですが、入力したソースがそのまま表記されてしまいます。

ちなみに、こんなものです。

#! c:/perl64/bin/perl

print "Content-type: text/plain\n\n";
print "Hello Perl !";

どこをどう変えればいいのか、わからないので、質問してみました。

わかる方がいましたら、教えてください。

初心者なので、お手柔らかにお願いします。

.





この質問に補足する.

このQ&Aに関連する最新のQ&A

A 回答 (5件)

CGIスクリプトのソースがそのまま出力されるのは、そのファイル/URIがCGIとして実行できていないためです。



httpd.confの<Directory>ディレクティブや<Location>ディレクティブなどの指定箇所が間違えているか、
ファイルの拡張子を間違えているか、
httpd.confを書き換えてからApacheをリスタートしていないか。。。


Forbiddenが出てきたら.cgiファイルに実行権限が無い。
Internal Server Errorが出てきたら、Perlがインストールされていないか.cgi拡張子とPerlが関連づけられていない。

ということが考えられます。

この回答への補足

talooさん

出来ました!!

apacheをリスタートさせたら出来ました。

何度も丁寧にアドバイスを下さいまして、ありがとうございました。

とても感謝しています。

補足日時:2012/09/05 08:35
    • good
    • 2
この回答へのお礼

遅くなってしまいましたが、本当にありがとうございました。

わかりやすく教えていただいたので、とても助かりました。

お礼日時:2012/09/05 18:58

 よくあるミスの一つなので、ネットに情報があります。



CGIのソースが表示される
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …

CGIを有効にする
http://www.be-webdesigner.com/technotes/server/h …

参考URL:http://www.be-webdesigner.com/technotes/server/h …

この回答への補足

LEVELUP100さん

ありがとうございます。

参考にさせていただきます。

補足日時:2012/09/05 08:33
    • good
    • 1

>No.2お礼


>という具合に設定を変えました。

すると、どうなりましたか?

この回答への補足

そうすると、ソースがそのまま表示されてしまうんですよね。質問に書いたソースが、そのまま・・・。

これでもうわからなくなってしまったわけです。

補足日時:2012/09/04 18:56
    • good
    • 1

そのファイルをCGIで実行するように、ウェブサーバーが設定されていますか?

この回答への補足

talooさん

ウェブサーバーはapache2を設定しています。

そして、

Options Indexes FollowSymLinks Includes ExecCGI

AllowOverride All

AddHandler cgi-script .cgi

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

という具合に設定を変えました。

補足日時:2012/09/04 08:53
    • good
    • 2

こんにちは。



まず、確認ですがperl自体のインストールはきちんと出来ていますか?

この回答への補足

LancerVIIさん

こんにちは。

perlはインストールされています。

補足日時:2012/09/04 08:38
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCGI実行できない。ソースが表示される

サーバを移し変えたところ、Perlで書いたCGIが実行できません。

ソースがそのまま表示される部分があります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV=Content-type CONTENT=text/html; charset=Shift_JIS><LINK REL="SHORTCUT ICON" HREF="../favicon.ico">
<LINK REL="stylesheet" HREF="style.css" type="text/css">

ヘッダー部分です。
上記のまま表示されます。

ヘッダー部分を直すんでしたっけ?
前に経験あって、クリアしたのですが、解消法忘れました。

同じソースを実行して全部が全部実行できないわけではありません。
文字コードではなかったような気がしますが。

Aベストアンサー

CGIのソースが先頭から表示されるんじゃ無く、HTMLのソースが見えるんですね? これ、もの凄く重要です。

直接の原因は、ブラウザが「CGIが吐いたHTML」をプレーンテキストと認識してるんでしょう。

その原因はWebサーバーソフトの設定がそうなってる可能性が高いかと。

簡便に対策するには、CGIが出力するレスポンスヘッダに
Content-type: text/html; charset=Shift_JIS
を追加してください。
# もしも既に Content-type: を出力してるなら、その内容を教えてください。

Content-type: の追加で解決したなら、サーバーの設定が以前と違うのが原因と断定できます。 Apacheなら、設定ファイルや .htaccess で本対策できるでしょう。


もう少し説明が必要ですか?

Q起動できない。コードだけが表示されてしまう。

最近CGIを勉強し始めたものです。
apache2.2.9をいれ、ActivePerl(Ver5.005_03)を入れて
下記のような簡単なコードを書いて実行してみましたが起動ができません。
=====================
#!/usr/bin/perl
print "abc";
=====================
なにか設定が必要でしょうか?
httpd.confあたりで設定が必要な部分がありますでしょうか?
調べてみたところ、推奨する設定だったのでそのままにして
テストしています。

Aベストアンサー

No.2です。
私の質問にお答えいただいてないので再確認です。
o Perl.exe は /usr/bin/ (Windowsなら C:\usr\bin)にありますか。
 そうでないなら、スクリプトの1行目に書く #!/usr/bin/perl を perl.exe のパスに合わせて書換えないといけません。
もし、C:\perl\bin\perl.exe なら、#!/perl/bin/perl です。
o cgiファイルは cgi-binフォルダに置いてありますか。
 apacheの初期設定は cgi-binフォルダ以外では cgiファイルは実行できないと思います。
o httpd.confで .cgiファイルが実行できるようにしましたか。
 httpd.cnf の中に、
 #AddHandler cgi-script .cgi という行があります。頭に付いている # を取ってください。
そうしたらいったん、apacheを止めて再起動した後、ブラウザから目的のcgiファイルをリクエストしてください。

Q特定のCGIだけ、作動するかわりにダウンロードされてしまいます

いつもお世話になります。
今日、カウンタのCGIと、そのカウンタをセッティングするCGIを二つのサーバに設置したのですが、片方のサーバに設置したセッティングCGIがおかしいんです。

本当ならアクセスするとパスワードを求める画面になるはずですが、「次の場所からダウンロードするように選択しました」という、Windowsではおなじみのダイアログが現れて、そのパスワードを入れるページ自体をダウンロードすることになってしまいます。
ここで「ダウンロード」にせずに「上記の場所から開く」にすればパスワード入力画面は開くのですが、これはローカルディスク上で開いていることになりますから、もちろんCGIとしては作動してくれません。

しかし、こんな現象が発生してしまうのはWin98やWin MEでアクセスした場合で、Macでアクセスすると正常にパスワードを求めてきて、もちろんそのまま認証してカウンタのメンテができます。

また、このWinで正常に作動しないのは2つのサーバに設置した内の片方だけで、全く同じものを全く同じ名前とセッティングでアップしてある、もう一つのサーバ上のCGIはMacでアクセスしようがWinでアクセスしようが正常に作動するのです。

しかも、異常がある方のCGIと同じディレクトリにアップしてある、他のCGIは全て正常に作動するのです。

パーミッションの設定も、CGIは755、ログは666と、間違っていないことを確認してあります。
perlへのパスも、Macでなら動くことでもおわかりのように、間違っていません。
尚、このCGIはDOS-Vの改行コードで記述してあります。

どなたかこの異常の原因がおわかりの方はいらっしゃいませんでしょうか?
どうか解決のためのアドバイスをお願いいたします。

いつもお世話になります。
今日、カウンタのCGIと、そのカウンタをセッティングするCGIを二つのサーバに設置したのですが、片方のサーバに設置したセッティングCGIがおかしいんです。

本当ならアクセスするとパスワードを求める画面になるはずですが、「次の場所からダウンロードするように選択しました」という、Windowsではおなじみのダイアログが現れて、そのパスワードを入れるページ自体をダウンロードすることになってしまいます。
ここで「ダウンロード」にせずに「上記の場所から開く」にすればパス...続きを読む

Aベストアンサー

 CGIスクリプトそのものではなく,その出力がダウンロードされてくるんですよね。だとすると,一番怪しいのはMIMEタイプ設定なのですが…(MIMEタイプについては,参考URLをご覧ください)。

 ダウンロードされるファイルがなんというMIMEタイプとして認識されているか,判らないでしょうか?

 Mozilla(おそらく Netscape 6.1 も)などであれば,ダウンロードダイアログに「~ xxxx/yyyy タイプのファイルをダウンロード後~」というように,ダウンロードしようとしているファイルのMIMEタイプが出力されるのですが,IEではどうやればいいのか私は知らないので…。

 そのMIMEタイプがわかれば,なぜダウンロードされてしまうのかという原因究明の手がかりになると思うので,できれば調べてみてください。

 または,そのCGIスクリプトのなかで,"Content-type: xxxx/yyyy" という文字列を出力しているところがあれば,それがそのMIMEタイプなのですが…。そこによけいな文字(見えない文字~例えば全角空白など~という可能性もあります)が入ってないか,あるいは設定されていないということがないか,調べてみてください。

 Macでちゃんと動くのは,ブラウザー側でそのMIMEタイプをどう扱うかがきちんと設定されている,あるいは(こちらの方が可能性は高いのですが)MIMEタイプ判別をルーズに行っている(例えばMIMEタイプの判らないテキストファイルは text/html として扱う),などの理由からではないかと思います。

参考URL:http://home.tripod.co.jp/help/building/file_mime.html

 CGIスクリプトそのものではなく,その出力がダウンロードされてくるんですよね。だとすると,一番怪しいのはMIMEタイプ設定なのですが…(MIMEタイプについては,参考URLをご覧ください)。

 ダウンロードされるファイルがなんというMIMEタイプとして認識されているか,判らないでしょうか?

 Mozilla(おそらく Netscape 6.1 も)などであれば,ダウンロードダイアログに「~ xxxx/yyyy タイプのファイルをダウンロード後~」というように,ダウンロードしようとしているファイルのMIMEタイプが出力され...続きを読む

QCGIの中で出力するテキスト内容をhtml側で表示する方法。

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形式で文字出力させている部分は、ブラウザ内に表示されません。

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

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>...続きを読む

Aベストアンサー

<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>');";

てな感じです。

<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: appli...続きを読む

Qapache で /cgi-bin/にアクセスできません。

Forbidden

You don't have permission to access /cgi-bin/ on this server.


Apache/1.3.19 Server at localhost Port 80

ブラウザで見ようとすると上のようなエラーが表示されます。
htdocs内の初期のテストのindex.htmlは参照できます。

Aベストアンサー

単純にpermisson(権限) がないのではありませんか?

ログインユーザ(nobodyとか?)に対する
ディレクトリのアクセス権限を変更してみては?

ログインユーザはhttpd.conf(?)で設定していますよね?
違うかな??

Qcgi-binにアクセスするとforbiddenになってします。

apache2.0.63をインストールし設定してもhttp://localhost/cgi-bin/
にアクセスするとforbidden、localhost/cgi-bin/index.cgiに
アクセスするとInternet Sever Errorと出てしまいます。
環境はwindowsvistaでcgi-binフォルダのパーミッションもプロパティ
でアクセス許可をフルコントロールにしたので問題ないと思います。
httpd.confはhttp://win.kororo.jp/archi/www/apache_fast.phpの
上から「CGI・SSIを使えるようにする」の
「AddHandler cgi-script .cgi //先頭の#を取り除く」までをそのまま真似しました。
それプラスDocumentRoot "パス"の下の<Directory "C:/apache2/htdocs">のパスをDocumentRootと同じパスに設定しました。
それとhttp://blog.goo.ne.jp/xmldtp/e/50e19ae5e407dcf822f40b472e4295e8
もすべて確認しましたが問題なかったです。
もし他に足りないことがあったら教えてください。
ちなみにapache2.0.63はリリースが1月20日とサイトに書いてあったのですが修正されて中身が変わってることもあるのでしょうか。
前は上記の設定だけで出来たのですが・・・

apache2.0.63をインストールし設定してもhttp://localhost/cgi-bin/
にアクセスするとforbidden、localhost/cgi-bin/index.cgiに
アクセスするとInternet Sever Errorと出てしまいます。
環境はwindowsvistaでcgi-binフォルダのパーミッションもプロパティ
でアクセス許可をフルコントロールにしたので問題ないと思います。
httpd.confはhttp://win.kororo.jp/archi/www/apache_fast.phpの
上から「CGI・SSIを使えるようにする」の
「AddHandler cgi-script .cgi //先頭の#を取り除く」までをそのまま真似...続きを読む

Aベストアンサー

動く筈のCGIが動かない件、本当にスクリプトは大丈夫ですか? perl -wc は、スクリプトの 1行目の妥当性もチェックしてくれますか? これは、Perl言語のシンタックスの枠外です。 ご自分の環境に合った内容が記述されていますか?


あるいは、suexec 関連は疑ってみましたか?


もしも、Windows版Apache と Cygwin版Perl の組合せだったりすると、苦労も多いでしょう。


一般に、インターネットから取得した情報やコード類が自分の環境にドンピシャリであることはそんなに多くは無いですよ。

QCGI実行環境下の.jsや.cssが動きません

環境
OS:RedhatLinux ES3
WevServer:Apache/2.0.54
Perl 5.8.0

CGIを設置しているディレクトリのなかに、JapaScriptを書いている
xxx.jsとスタイルを定義しているxxx.cssを置いているのですが、
CGIを実行すると、Apacheのエラーログの中に

パーミッションが755だと
(8)Exec format error: exec of '/hoge/xxx.css' failed,
(8)Exec format error: exec of '/hoge/xxx.js' failed,
パーミッションを666すると
(13)Permission denied: exec of '/hoge/xxx.css' failed,
(13)Permission denied: exec of '/hoge/xxx.js' failed,

が出力されてしまいます。
もちろん、JavaScriptのエラーも出てしまいます。

.jsや.cssを正常に読み取らせるにはどのようにhttpd.confを
設定すればよいのでしょうか?

※ちなみに、CGIの実行を許可(ScriptAlias)していない
ディレクトリでは.jsや.cssは正常に動いています。

環境
OS:RedhatLinux ES3
WevServer:Apache/2.0.54
Perl 5.8.0

CGIを設置しているディレクトリのなかに、JapaScriptを書いている
xxx.jsとスタイルを定義しているxxx.cssを置いているのですが、
CGIを実行すると、Apacheのエラーログの中に

パーミッションが755だと
(8)Exec format error: exec of '/hoge/xxx.css' failed,
(8)Exec format error: exec of '/hoge/xxx.js' failed,
パーミッションを666すると
(13)Permission denied: exec of '/hoge/xxx.css' failed,
(13)Permission denied:...続きを読む

Aベストアンサー

ScriptAlias で指定された場所においては、Apache は全てのファイルを CGI スクリプトとみなしてしまいます。

なので、拡張子が .cgi、.pl のファイルだけ CGI とみなして欲しいのであれば、CGI スクリプト以外のファイルを別のディレクトリに置くか、以下のように設定してあげる必要があります。

Alias xxx yyy

<Directory yyy>
AddHandler cgi-script .cgi .pl
Options ExecCGI
</Directory>

QApacheでhttp://localhost/が表示されない

Apacheバージョン2.0.50をインストールし、設定ファイルは一切変更していない状態でhttp://localhostと入力しても「あなたの予想に反して・・・」のページが表示されません。
何回かApacheの再インストールも試してみましたが変化がありません。
ローカルで動作確認するだけなので、インストールにあたってNetworkDomainなどのアドレスは「localhost」を入力しています。
何か原因を特定する方法はありませんでしょうか。
ちなみにOSはWindowsXPのHomeEditionです。

Aベストアンサー

(1) まずは、Apacheが起動しているか確認しましょう。
  これは管理ツールのサービス、Apache Server Monitorを見ればわかります。

(2) ポート番号80がLISTEN状態になっているか確認しましょう。
  これはnetstatコマンドで確認できます。

(3) パーソナルファイアウォールソフトをインストールしているなら、
  localhost:80 からの接続を許可しているか確認してみましょう。

(4) IISなど、他のwebサーバを同時に動かしていないか確認してみましょう。

(5) ブラウザでプロクシサーバを指定しているのでしたら、
  localhostはプロクシーを見ない、など設定してみてください。


ほかにもいろいろありますが、Apacheの設定の前に、これくらいは確認しましょう。

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qapacheユーザの実行権限設定はどうすれば良い?

■環境
・Cent OS

■状況
・所有者hogeのディレクトリxに対して、スクリプト経由(apacheユーザ権限)でchmodしようとすると、エラーになります
・スクリプト経由(apacheユーザ権限)でディレクトリ作成しようとしても、エラーになります

■質問
・どうすれば良いでしょうか?
・所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

・ディレクトリ所有者がhogeであることが問題? apache所有にした方が良い?
・それとも、スクリプト実行を、apacheユーザ権限ではなく、所有者hogeにした方が良い? どうやって?

・そもそもapacheユーザ権限は、一般的にどう設定するものなのでしょうか? rootみたいに最強にする?

Aベストアンサー

> 所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

基本的にはそれでOKですが、それだけではapacheユーザが作成した
ファイルをhogeユーザが変更できなくなってしまうかもしれません。

user=hoge,group=hoge
user=apache,group=apache,groups=hoge

groupは一次グループ、groups2は二次グループです。umask002 (新
規作成されたファイルのパーミッションが775 ) に設定されている
とします。

hogeユーザが作成したファイルはhoge/hoge なので、hogeグループ
に属するapacheユーザは編集可能です。しかし、apacheユーザが新
規作成したファイルはapache/apache になるので、apacheグループ
に属さないhogeユーザは編集できません。

そこで、ディレクトリをhogeユーザで作成し、ディレクトリにsgid
ビットを立てます。

$ chmod 2775 dir
$ ls -l dir
drwxrwsr-x 2 hoge hoge 4096 4月 7 13:35 dir

これで、apacheユーザがdir上に作成したファイルはapache/apache
ではなく、apache/hoge になるので、hogeユーザも編集できるよう
になります。

> 所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

基本的にはそれでOKですが、それだけではapacheユーザが作成した
ファイルをhogeユーザが変更できなくなってしまうかもしれません。

user=hoge,group=hoge
user=apache,group=apache,groups=hoge

groupは一次グループ、groups2は二次グループです。umask002 (新
規作成されたファイルのパーミッションが775 ) に設定されている
とします。

hogeユーザが作成したファイルはhoge/hoge なので、hogeグループ
に属するapacheユーザは編集可能...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング