• ベストアンサー

CGI内からSSIを実行したいのですが・・・

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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-part-iii
shunet
質問者

お礼

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

その他の回答 (2)

回答No.3

とりあえず、CGIファイルからSSI起動は出来ます。 print "<!--#include file=\"sample.html\"-->\n"; で、行けるはずですが??? 私が前やったときは、これでOKでした。

  • oneyan
  • ベストアンサー率42% (80/187)
回答No.1

直接Perlで、やったことはないので、 勘なのですが、 <!--#include file="sample.html"-->\n の中の(")を(')、または無記入にしてみてください。 print "の(")をinclude file="の(")で、 閉じてしまっているような気がしました。 違ってましたらすみません。 (MacJPerl or AppleScriptの場合なので) ただ、これだけですと<!-- -->でコメント化されて しまうかもしれませんので、 SSIの効くHTMLを作って、頭の部分を丸々、print " "に 入れたほうが良いのでは?と思いました。

関連するQ&A