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

趣味でPerlによるCGIをやっています。
CGI出力結果と他のページとでヘッダーを共通化したいのですが、CGIファイル内にSSIの#include fileなどを挿入することはできるのでしょうか。
CGIファイルの中に print "<!--#include file="sample.html"-->\n";とするとそのままソースに書きこまれて出力されるだけで実行されないんですけど、、、なにかうまい方法はないでしょうか、お願いします。

A 回答 (3件)

直接Perlで、やったことはないので、


勘なのですが、

<!--#include file="sample.html"-->\n

の中の(")を(')、または無記入にしてみてください。

print "の(")をinclude file="の(")で、
閉じてしまっているような気がしました。

違ってましたらすみません。
(MacJPerl or AppleScriptの場合なので)

ただ、これだけですと<!-- -->でコメント化されて
しまうかもしれませんので、
SSIの効くHTMLを作って、頭の部分を丸々、print " "に
入れたほうが良いのでは?と思いました。
    • good
    • 0

oneyanさんがおっしゃるとおり、


print "<!--#include file="sample.html"-->\n";
だと「"」のところで文字列が分断されてしまって
「裸の文字列(sample.html)があったよ」
という旨のエラーになりますね(Perl 5.6で確認)。
その場合出力もされないはずなので、多分質問なさるときに
写し間違えたのでしょう。

で、サーバがApacheの場合ですが、残念ながらできません。
(下記オフィシャルサイトのFAQ参照)
セキュリティの問題もあるし、および現在の仕組みではどのように
それを実現すればいいかはっきりしない、1.3の次のバージョン
で解決したい課題のひとつだ、とあります。

そして、代替手段としては「SSIにやってほしいことを、
あなたのスクリプト自体がやってしまうことです」と書いてありますね。

つまり、その個所でsample.htmlをインクルードしたいのなら、
その代わりに

open(SAMPLE, "sample.html");
while (<SAMPLE>) {
print;
}
close(SAMPLE);
と書いてしまうことです。さらに共通化するなら、上記のコードを
sub print_header {
....
}
なんていうサブルーチンにして別ファイルに保存しておき、
CGIでは適宜それをrequireしておいて、必要な個所でprint_headerを
呼び出す、なんて作り方もあり得るでしょうね。

…そこまでする必要ないかもしれませんが。まあ、SSIで
やってることはみんなこの手で、Perlスクリプト側で書いて
しまうのが良いかと。

参考URL:http://httpd.apache.org/docs/misc/FAQ.html#ssi-p …
    • good
    • 0
この回答へのお礼

ありがとうございます!たいへん勉強になりました。
ちなみにサーバーはAPACHEなので、できないんですね、、、
教えていただいたやり方を参考にやっていきたいと思います。

お礼日時:2001/06/12 00:03

とりあえず、CGIファイルからSSI起動は出来ます。


print "<!--#include file=\"sample.html\"-->\n";
で、行けるはずですが???
私が前やったときは、これでOKでした。
    • good
    • 0

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