プロが教える店舗&オフィスのセキュリティ対策術

メニューがコンテンツ変更で増減したときの管理がしやすいように、メニュー部分をCGIで作り、全ページで同じメニューを表示させるようにしました。

通常のHTMLファイルはこれで正常に表示するのですが、メールフォームCGIや掲示板CGI等にも同じように表示させたいのですがうまくできません。

HTMLファイルと同じように「include virtual」を記入しても何も表示されず、ソースを見ると「include virtual~」がむなしく表示されているだけでした。

で、次に「require '../menu/menu.cgi';」を試してみたのですが、こちらは500エラーが出てしまいます。

どのようにしたらよいのでしょうか?
メニューCGIはただのHTML文ではなく、ページに応じたサブメニュー表示等をしているのでデコード処理をしていますが、これが原因とかありますか?

A 回答 (3件)

ソースに表示されるということは、


正しく、print する場所に書いていると思うので、
原因は、httpd の設定にあると思います。

たとえば、Apache の標準設定では、拡張子が .shtml の時のみ、
SSI を実行されるので、設定に、.cgi を追加する必要があります。(非推奨)
また、 htaccess が使えない場合は、設定をするために、サーバ管理者である必要があるので、あまり現実的では無いかもしれません。

require での失敗の件ですが、
正しく“真”が返っているか確認してみて下さい。
require で読み込まれるスクリプトは、最後に必ず“偽”以外の値を返しておく必要があります。
簡単なスクリプトであれば、最後に 1; を追加するだけで良いです。

また、require の代わりに、do を使うことも可能だと思います。
この場合、真を返さなくてもエラーは出ず、
スクリプトとして実行されるので、SSI に似た挙動と呼べるのかもしれません。
print do '../menu/menu.cgi';
    • good
    • 0

requireが失敗した原因ですが


スクリプトの冒頭に

#!/usr/local/bin/perl (<=これは環境に合わせて)
#以下の3行を付け足して試す
$| =1;
print"Content-type: text/html\n\n";
open(STDERR,">&STDOUT");

と3行追加して実行してみます。これでエラーの原因が画面に表示されることもありますが
Can't locate ***.cgi in @INC 以下略
となりませんか?

そうであればrequireされたスクリプトの中でさらに別Fileをrequireしようとしたが
ディレクトリが違うため読み込めなかったためです。
親CGI=>require=>別ディレクトリにある子スクリプト=>require=>子スクリプトと同じ場所にある孫file
の場合 カレントディレクトリは親CGIの場所のままですから
子スクリプトから require "./孫file";
としたらエラーになります
    • good
    • 0

Perlにはincludeという関数や命令はありません。



>どのようにしたらよいのでしょうか?

500になる原因を探し当ててください。
サーバのログをみるとかして。

>メニューCGIはただのHTML文ではなく、ページに応じたサブメニュー表示等をしているのでデコード処理をしていますが、これが原因とかありますか?

menu.cgi の最後は
1;
になってますか?
    • good
    • 0

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