プロが教えるわが家の防犯対策術!

htmlのタグに下記のように記述し(test.html)
<FORM METHOD="POST" ACTION="http://192.168.100.100:8080/cgi-bin/test.pl">
cgi-binにあるtest.plを実行したいのですが、
test.plのコードの中身がブラウザに表示されてしまいます。


httpd.confの設定は下記のように設定してあり、
権限もtest.pl,test.htmlともに755で設定しています。
**
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

<Directory "/usr/local/apache/cgi-bin/">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

AddHandler cgi-script .cgi .pl .rb

A 回答 (6件)

その後どうなったのか判りませんが 今日少し時間がありましたので


apache1.3.41をコンパイルしてみました(2.0や2.2と違ってコンパイルがすぐ終わるね)
/usr/local/uie/apache-root/cgi-bin/ ディレクトリを作って
#5の下に書いたスクリプトを env.txtとして保存
さらに同じ内容で拡張子無しの 0 というfile名でも保存して
chmod 705 *

/usr/local/apache/conf/httpd.conf に
ScriptAlias /cgi-bin/ "/usr/local/uie/apache-root/cgi-bin/"
<Directory "/usr/local/uie/apache-root/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
#AddHandler text/plain .cgi .pl .txt  
##↑の行頭の#を取るとCGIではなくプレーンテキストとして扱われます。
</Directory>

port:8134
#↑80から8134に変更
と記述してから
/usr/local/apache/bin/apachectl start

http://ホスト名:8134/cgi-bin/env.txt
http://ホスト名:8134/cgi-bin/0
 ともに問題なく CGIとして動きます。

次に 上記 #AddHandler 行頭の # を取ってから
/usr/local/apache/bin/apachectl restart
すると
http://ホスト名:8134/cgi-bin/0
 はCGIとして動作しますが

http://ホスト名:8134/cgi-bin/env.txt
 はプレーンテキストとしてソースが表示されます
 (↑FireFOXの場合 MSIEだと文内にHTMLタグが有るのでtext/plainでサーバーから送られてもHTMLとして表示してしまいます)

###まとめとして
1.ScriptAlias内ではデフォルトで全てのfileを拡張子とは無関係にCGIとして扱われる
2.逆にScriptAlias内でCGI以外として扱ってほしい場合は AddHandler で指定する

あと、もしも/usr/local/apache/conf/httpd.confをいじりすぎて訳が判らなくなったら
mv httpd.conf test-httpd.conf などと名前を変えてから
/usr/local/apache/conf/httpd.conf.default をhttpd.confとしてコピーすれば
初期状態に戻ります(apache2系なら conf/の下の original/httpd.conf)
    • good
    • 0
この回答へのお礼

ありがとうございます。
そのご試行錯誤してソースの改行コードがCR+LFだったため
修正したところ、うまく動くようになりました。
大変初歩的なミスですみません。

お礼日時:2008/06/09 15:48

ScriptAliasが有効な場合


OptionsもAllowOverrideもNoneのままで
AddHandlerの設定も不要です
 つまり<Directory "/usr/local/apache/cgi-bin/"> に関しては
 質問文のままでCGIが動きます

ScriptAliasで設定されたディレクトリ内は
 初期状態のままで 全てのFile(拡張子の有無に関わらず)がCGIと見なされます
 ですから 普通の.txtや 画像Fileを置いて、ブラウザでアクセスしようとしても
 ApacheはCGIとして実行させようとしますので 必ず500errorに成ります。

ですから 質問者さんの場合に考えられるのは
1.ScriptAliasが無効になっている
   ScriptAliasではなく普通のAliasで指定されている
   これだと当然初期状態のままでは cgiは動きませんので
   <Directory コンテナで OptionsとAddHandler を指定するか
    AllowOverrideで.htaccessを有効にして そちらでOptionsとAddHandler を指定しないとCGIとして動きませんが
ただ不思議なのは 少なくともほとんどのLinuxなら
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
はApache1.3系を自分でコンパイルして入れた場合の初期設定のまま
(Apache2系だと ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/")
ですので わざわざScriptAlias をAliasと書き換えない限り CGIが無効になる筈は無いのですが?

2.実は実行されているが CGIで text/plain を吐いているため
  MSIEでおかしな処理をする
 これは、昔はときどきApacheのMLでも質問されてましたが
 MSIEが変な仕様のためにtext/plainをうまく処理できません
 text/html を使ってHTML文を出力した方がいいです。

####オマケ付き(笑) 以下のスクリプトを
### /usr/local/apache/cgi-bin/env.txt (.cgiや .plでなく .txtです)という名前で設置し
### ブラウザでアクセスしてみてください
### ScriptAliasが有効であれば 環境変数一覧が表示されます

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print<<HTML_HEAD;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja">
<HEAD>
<TITLE>ENV TEST</TITLE>
</HEAD>
<body>
<H2>ENV TEST</H2>
<hr>
HTML_HEAD
foreach (sort(keys(%ENV))){print "$_ = $ENV{$_}<P>\n";}
    • good
    • 0

もう一個ありました。



AllowOverride None

Overrideを全て拒否してますので、それ以下の全ての指定が無効になってますね。
この行を消してみてください。

1回で全部見つけられずすみません。
    • good
    • 0

> <Directory "/usr/local/uie/apache-root/cgi-bin/">


最初の質問の指定と違ってますが?
違うディレクトリを指定しても意味がないと思いますけど。

この回答への補足

すみません、いままでは公の場ということもあり
フォーマルなものに書き換えていましたが
先ほどのはそのままコピーしてしまいました。

設定は同じディレクトリを指しています。

補足日時:2008/05/28 19:41
    • good
    • 0

AddHandler cgi-script .cgi .pl .rb


この記述ですが、<Directory>の外側に書いてありますか?
それだと.htaccessのあるディレクトリに適用されて、/usr/local/apache/cgi-bin/の中にある.cgi、.pl、.rbファイルには適用されませんので、
<Directory>の中に書く様にしてみてはいかがでしょうか。

それから
Options ExecCGI
ではなく
Options +ExecCGI
にしておく方がいいと思います。

この回答への補足

ありがとうございます。
このように設定して再起動してみましたが
ソースコード表示のままでした。

<Directory "/usr/local/uie/apache-root/cgi-bin/">
AllowOverride None
Options +ExecCGI
Order allow,deny
Allow from all
AddHandler cgi-script .cgi .pl .rb
</Directory>

補足日時:2008/05/28 11:50
    • good
    • 0

Options None が原因ではないでしょうか。


Options +ExecCGI としてみてください。

参考URL:http://httpd.apache.org/docs/2.0/ja/howto/cgi.html

この回答への補足

ありがとうございます。

<Directory "/usr/local/apache/cgi-bin/">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

設定を変更してみましたが、結果は変わりませんでした。
ソースコード表示のままです。

補足日時:2008/05/28 09:36
    • good
    • 0

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