やまとです。

CGIから、画像を呼び出しています。
 CGIファイル:Apache/cgi-bin/test.cgi
 画像ファイル:Apache/cgi-bin/image/test.gif
 test.cgiでの画像呼出部分:<image src=./test.gif>
しかし、画像が出てきません。なぜでしょう?
自分なりに調べてみましたが、大分原因が分かってきました。

error.log見てみると、
c:/apache/cgi-bin/test.jpg is not executable; ensure interpreted scripts have "#!" first line
couldn't spawn child process: c:/apache/cgi-bin/top_image.jpg
と言うエラーでした。
どうやら、画像ファイルをCGIスクリプトとして見てしまっているようです。
(↑考え合ってますよね)
おそらく、httpd.confがおかしい(?)Aliaseですかね(?)

ここまで調べてみましたが、対処方法がわかりません。
どなたか、どこを、どう直せば良いのか、
出来るだけ詳しくご教授願えないでしょうか?

宜しくお願いします。

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

A 回答 (7件)

> CGIファイル:c\:apache/cgi-bin/test_dir/test.cgi


> 画像ファイル:c\:apache/cgi-bin/test_dir/image/test_img.gif
>(CGIの)画像呼び出し部分:<image src=./image/test_img.gif>
>以上の様に呼び出すことは出来ないでしょうか?

通常できません。Apacheはhttpd.confのDocumentRootで指定されている以外のディレクトリからファイルをブラウザに返せないんです。

CGIも同様ScriptAliasで指定したディレクトリ以外に置かれたファイルは実行できないし、逆にブラウザからリクエストされると、そこに置かれたファイルは何でも実行しようと試みます。

ただ、DocumentRootに置いたcgiファイルを実行できるような設定はあります。
# If you want to use server side includes, or CGI outside
# ScriptAliased directories, uncomment the following lines.
#
# To use CGI scripts:
#
AddHandler cgi-script .cgi
のようにAddHandlerで始まる行のコメントをると、cgiファイルc:/Apache/htdocsいかで実行できるようになるはずです。

もう一つは裏技なんですが、画像ファイルを
c\:apache/cgi-bin/test_dir/image/
に置いて、
c:/Apache/htdocs/test_dir/
にc\:apache/cgi-bin/test_dir/image/のショートカットを置きます。(UNIXではシンボリックリンク)
画像へのリンクは<image src=/test_dir/image/test_img.gif>
もちろん、ショートカットをc:/Apache/htdocs/直下においても構いません。
そのときは<image src=/image/test_img.gif>
となります。

ややこしいですよね。やっぱりhtdoc以下に置いたほうが良いとおもうんですけど。。。
    • good
    • 0
この回答へのお礼

ご回答有難うございました。

やはりそうですか。
htdocs以下に画像を置く事にします。

お礼日時:2002/03/18 10:46

ごめんなさい。

さっきの回答で、画像リンクがまちがってました。
正しくは:
<image src=/test.gif>
です。
    • good
    • 0
この回答へのお礼

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

nak205さんの教えて頂いた方法で画像が表示されました。
では、
 CGIファイル:c\:apache/cgi-bin/test_dir/test.cgi
 画像ファイル:c\:apache/cgi-bin/test_dir/image/test_img.gif
(CGIの)画像呼び出し部分:<image src=./image/test_img.gif>
以上の様に呼び出すことは出来ないでしょうか?

この方法ですと、画像ファイルの管理がしやすいので…
宜しくお願いします。

お礼日時:2002/03/16 16:37

画像ファイルやhtmlファイルを/cgi-bin/以下に置くと正しく表示できません。


例えば:
c:/Apache/htdocs/test.gif
に置いて、
<image src=test.gif>
にすれば表示できます。

もしどうしてもcgi-bin以下に画像を置きたい場合は、面倒ですが、perlで画像ファイルをオープンして、それを1行づつprint文でブラウザに返す方法があります。めんどいので、htdocs以下にいれて、srcのパスをサイトルートの/から始めたほうが良いですよ。
    • good
    • 0

sinxさんに1票。


提示したフォルダ構成が正しいとすれば、呼び出すパスが間違ってる時点で、正しいトラブルシューティングは不可能です。
    • good
    • 0
この回答へのお礼

sinxさん、you-mさんご回答有難う御座います。
(すみません、一緒に回答のお礼をしてしまって…)

画像名などは、単なるタイプミスでした。
呼び出すパスはあっています。
すみません(・_・;)

お礼日時:2002/03/16 14:00

少なくとも、


<image src="test.gif">ではなくて、
<IMG src="./image/test.gif">
だと思いますが。
    • good
    • 0

「test.gif」をコールして、「test.jpg」のエラーになる原因は分かりませんが、CGIソースのどこかに「test.gif」を間違えて、「test.jpg」とかいてあるのだと思います。



configの中で、「cgi-bin」フォルダの設定が違っているんだと思います。
つまり、cgi専用エリアにしてあるのだと思います。

もしかしたら、ドキュメントルート自体の設定も違っていませんか?
cgi-binの下にHTMLファイルや画像ファイルもいれるなら、configでそのように宣言しておかなければ認識しません。
その場合は、「/cgi-bin/」にはcgiだけを入れ、画像は「/images/」に入れて、絶対アドレスで指定します。

この回答への補足

ご回答有難うございます。

Document Root は設定した時のまま以下の様にしています。
 DocumentRoot "c:/Apache/htdocs"
ここも、書き換える必要があるのでしょうか?
あるのでしたら具体的にどのように変えるのでしょうか?
すみません。宜しくお願いします。

補足日時:2002/03/16 14:53
    • good
    • 0

こんにちは。



>画像ファイルをCGIスクリプトとして見てしまっているようです。
ということですが、どのように呼び出されているのでしょうか??
最終的にHTMLで表示させるだけなら、画像のファイル名を取得するだけでよい、と思うのですが。
もしかしたら/cgi-bin/下のディレクトリにあるため、そのように認識されてしまっているのかもしれません。

>httpd.confがおかしい(?)
そのような設定にすることも可能ですが、他のものはどうなっているのでしょうか?
単純なHTML等で同じ画像を呼び出した場合はどうなりますか??

この回答への補足

ご回答有難う御座います。

>他のものはどうなっているのでしょうか?
他のものと言いますと…?

>単純なHTML等で同じ画像を呼び出した場合
普通のHTMLから、画像を呼んでも、同じ結果になってしまいます。
やはり、画像ファイルをCGIとみているようです。

補足日時:2002/03/16 14:57
    • good
    • 0

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

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

Q#!/usr/local/bin/perl

とPerlのCGIの先頭に書きますが
FedoraCore3でPerlを使うときにはどのように書けばよいのでしょうか?

Aベストアンサー

#!/usr/bin/perl

でしょうか。FedoraCore3は私は使っていませんが、cgiの先頭に書くのは、perlへのパスになるので、もしターミナルが使える状況なら

which perl

で得られるパスを #! につづけて書けばOKです。

Q#!/usr/local/bin/perlで命令が出せません。

プログラミングのド素人で、独学でwindows上でcygwinを使っている者から質問させていただきます。「#!/usr/local/bin/perl」というコマンドをプログラムの先頭に書いて、[ファイル名]を入力してcygwinで命令をしたところ、命令が実行できず、「commond not found」と出てしまいました。そこで、ネット上で、いろいろ調べて、試してみたのですが、どうしても、解決できません。
どなたか、アドバイスをいただけないでしょうか?
ちなみに、perl [ファイル名]では、命令を実行することができます。「type -a perl」というコマンドを入力すると、「/cygdrive/c/Perl/bin/perl」というのがでてきたので、「#!/cygdrive/c/Perl/bin/perl」というコマンドを書いても上手くいきませんでした。
ちなみに、私が書いたプログラムは、以下のようなものです。
#!/cygdrive/c/Perl/bin/perl (あるいは#!/usr/local/bin/perl)
# hello -- 挨拶のプログラム
print ("hello");

プログラミングのド素人で、独学でwindows上でcygwinを使っている者から質問させていただきます。「#!/usr/local/bin/perl」というコマンドをプログラムの先頭に書いて、[ファイル名]を入力してcygwinで命令をしたところ、命令が実行できず、「commond not found」と出てしまいました。そこで、ネット上で、いろいろ調べて、試してみたのですが、どうしても、解決できません。
どなたか、アドバイスをいただけないでしょうか?
ちなみに、perl [ファイル名]では、命令を実行することができます。「type -a perl...続きを読む

Aベストアンサー

perl.exe が、あなたの書いたスクリプトを見付けられないんじゃ無いでしょうか。

あなたの書いたスクリプトが hello.pl だとすると、

./hello.pl

とかで起動できないいんですね? 以下の Windows風の絶対パスでの起動を試してみてください。

'c:\foo\bar\hello.pl'


type perl の結果でスクリプトの 1行目 を決めるのは、大方は正しいでです。 正しくないのは、ふたつ以上のPerl処理系がインストールされた環境で使い分けるべき場合ですね。

type の結果が 「/cygdrive/c/Perl/bin/perl」というのは 「c:\Perl\bin\perl」であって、Cygwin の Perlでは無いのでしょう。それが Cygwin のShell(bash等) と相性の悪いのはしょうがない事です。

まずは、c:\Perl\bin\perl を使うのか Cygwin のPerl を使うのかを決めるのが良いと思います。 それにってその後にすべき事が変ってきます。

perl.exe が、あなたの書いたスクリプトを見付けられないんじゃ無いでしょうか。

あなたの書いたスクリプトが hello.pl だとすると、

./hello.pl

とかで起動できないいんですね? 以下の Windows風の絶対パスでの起動を試してみてください。

'c:\foo\bar\hello.pl'


type perl の結果でスクリプトの 1行目 を決めるのは、大方は正しいでです。 正しくないのは、ふたつ以上のPerl処理系がインストールされた環境で使い分けるべき場合ですね。

type の結果が 「/cygdrive/c/Perl/bin/perl」とい...続きを読む

Qperlの1行目が#!/usr/bin/perlだと動かず#!/usr

perlの1行目が#!/usr/bin/perlだと動かず#!/usr/bin/perl5.8.9だと動くのですが、
#!/usr/bin/perlで動くようにするにはどうしたらいいのでしょうか?

インストールされているperlは
This is perl, v5.8.9 built for darwin-2level
です。

どこかでパスの設定をしてやればいいと思うのですが、
どこに何を書けばいいのかよくわかりません。

環境はMacOsX v10.6 SnowLeopardです。
どなたかよろしくお願いいたします。

Aベストアンサー

MacOSのことはよくわかりませんが、一般的なUNIX系OSで考えると、、

シンボリックリンク/usr/bin/perlを作り、/usr/bin/perl5.8.9にリンクすればいいでしょう。
ln -s /usr/bin/perl5.8.9 /usr/bin/perl

そうすればPerlスクリプトは「#!/usr/bin/perl」のままでOKです。

QActivePerlで#!/usr/bin/が無効

WindowsXPにActivePerl(5.16.3.1603)をインストールして、
コマンドラインに「perl script.scr」と入力して
スクリプトファイルは実行できるのですが、
スクリプトファイルの1行目に「#!/usr/bin/perl」を記述して、
コマンドラインに「script.scr」と入力して実行しようとすると、
「C:\・・・\script.scrは有効なWin32アプリケーションではありません。」
というメッセージが表示されて正しく実行できません。

perl.exeのあるフォルダをC:\usr\binフォルダにして、
1行目を
#!/usr/bin/perl
#!C:/usr/bin/perl
#!C:\usr\bin\perl
などいろいろ試してみましたが、どれも
前述のメッセージが表示されて実行できませんでした。
コマンドラインに「script.scr」と入力するだけで
実行することができるようにするには
どのようにすればいいのでしょうか。

script.scrの拡張子scrをplなどに変更して
この拡張子のファイルに対してperl.exeに関連付けることにより
script.plだけでも実行できるようにはなりますが
拡張子.scrではこの関連付けができませんので
#!/usr/bin/perl等を使用する方法で解決したいです。

ジャンクションとかApacheなどが全く分かりませんので
これらを使わずに簡単にできる方法がありましたら教えてください。
(なお使っても分かりやすい手順があれば可です)
よろしくお願いします。

WindowsXPにActivePerl(5.16.3.1603)をインストールして、
コマンドラインに「perl script.scr」と入力して
スクリプトファイルは実行できるのですが、
スクリプトファイルの1行目に「#!/usr/bin/perl」を記述して、
コマンドラインに「script.scr」と入力して実行しようとすると、
「C:\・・・\script.scrは有効なWin32アプリケーションではありません。」
というメッセージが表示されて正しく実行できません。

perl.exeのあるフォルダをC:\usr\binフォルダにして、
1行目を
#!/usr/bin/perl
#!C:/usr/bin/perl
...続きを読む

Aベストアンサー

ファイルの先頭を見て、#!だったらその行を実行コマンドとして実行、というのは、Unix系OSの機能です。
Windowsでは使えません。
http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_%28Unix%29

scr は、たしか、Windowsのスクリーンセーバー用に使われていたと思います。
どうしてもscrのままで、となると難しいと思います。

BATファイルに埋め込んで、shebang風に使う、という方法はあるのですが。
Windows shebangで検索するといくつか見付かります。

Qパイプをopenして/usr/bin/grepを実行する方法

子プロセスで"-|"でopenして、そこに標準出力で/usr/bin/grepの実行結果を出力し、そのデータを取得したいです。
$pid = open(FIFO, "-|")をした時点で、$pidにはプロセスIDが入っています(0以外)。
0のときは子プロセスが起動しているのでgrepを実行し、0以外であれば標準出力の内容を取得するというロジックでいいと考えたのですが、一度もgrepが実行されません。
また、grepをexecしているのですが、その第二引数を何にしていいのかも模索中です。
どこをどのように修正したらいいでしょうか。
よろしくお願いします。

die "openエラー: $!" unless defined ($pid = open(FIFO, "-|"));
if(!$pid) {
exec('/usr/bin/grep', '-isl', $search, @list) or die "grepエラー: $!";
} else {
while (<FIFO>) {
print $_;
}
close FIFO;
}

【環境】
WindowsXP Professional(SP2)
Apache2.2
ActivePerl v5.8.8

子プロセスで"-|"でopenして、そこに標準出力で/usr/bin/grepの実行結果を出力し、そのデータを取得したいです。
$pid = open(FIFO, "-|")をした時点で、$pidにはプロセスIDが入っています(0以外)。
0のときは子プロセスが起動しているのでgrepを実行し、0以外であれば標準出力の内容を取得するというロジックでいいと考えたのですが、一度もgrepが実行されません。
また、grepをexecしているのですが、その第二引数を何にしていいのかも模索中です。
どこをどのように修正したらいいでしょうか。
よろしく...続きを読む

Aベストアンサー

質問の例では双方向のやり取りは必要ないので、
#1の tacosan さんの回答の通りで
open my $fd, "grep -isl '$search' @list"or die $!;

とでもすればよいのではないかと。

ついでにいうと、このパターンの場合、Unixのような
fork & exec が必要なので、ActivePerlでは
期待通りに動きません。

というかopenのところで
'-' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

となると思うんですが。

ついでのついでで、三引数バージョンの open ならActivePerlでもいけます。

open my $fifo, "-|", 'grep -e use *.pl' or die;
#open(my $fifo, '-|') || exec 'grep', '-e', 'use', '*.pl';
#↑こっちはダメ
while (<$fifo>) {
print;
}

もし
Perlの標準出力からデータを送る→
プログラムで処理してその標準出力に送る→
Perlで受け取る
ということをやりたいのなら、

IPC::open2 とか IPC::open3 とかつかってください。

質問の例では双方向のやり取りは必要ないので、
#1の tacosan さんの回答の通りで
open my $fd, "grep -isl '$search' @list"or die $!;

とでもすればよいのではないかと。

ついでにいうと、このパターンの場合、Unixのような
fork & exec が必要なので、ActivePerlでは
期待通りに動きません。

というかopenのところで
'-' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

となると思うんですが。

ついでのついでで、三引数バ...続きを読む


おすすめ情報