CGIの中でSSIを呼ぶには?

[上に] [前に] [次に]
いそぎんちゃく [HomePage] 1999/11/30(火) 17:20:35
SSIを使って

「navigator.html」
<A HREF="hogehoge.html">ほげほげ</A>
<!--#config timefmt="時刻形式指定"-->
<!--#flastmod file="hogehoge.html"-->

というファイルを作り、通常のHTMLから
<!--#include file="navigator.html"-->

としてやると、hogehoge.htmlの最終更新日時をリンクと共に表示してくれますが、

CGIから
$navi = 'navigator.html';
open(DB,$navi);
@navis = <DB>;
close(DB);
print "@navis\n";

としてやっても、リンクが表示されるだけで最終更新日時は表示してくれません。
いったい、どうすればCGIの中でSSIを使用して、最終更新日時を表示してくれるようになるでしょうか?

andi 1999/11/30(火) 17:39:43
$navi = 'navigator.html';
open(DB,$navi);
@navis = <DB>;
close(DB);
print "@navis\n";

は単にファイルの中身を読みこんで表示してるだけでは。

$mtime = (stat($navi))[9];
を使ってください。
SSIは必要無いと思います。

いそぎんちゃく 1999/11/30(火) 17:48:07
>SSIは必要無いと思います。

navigator.htmlを通常HTMLとCGIとで、共用して使いたいと思ったのです。
ページ構成が変わったときでも、通常HTMLやCGIを変更しなくて済むように、両方からSSIでnavigator.htmlを呼んでやればと思ったのですが…、そういうことは出来ないのでしょうか・・・・?

M.Nakawaki 1999/11/30(火) 19:25:54
http://www.wildarms-fan.ne.jp/test/test_1/test_1.html
に多分貴方の希望しているだろうと思う機能のプログラムを置いてみた。
よかったら使ってやって下さい。

B-Cus 1999/11/30(火) 23:51:07
> そういうことは出来ないのでしょうか・・・・?
(少なくとも apache では) できません。
  http://japache.infoscience.co.jp/japanese_1_3/manual/misc/FAQ.html#ssi-part-iii
# しかし、ひどい日本語だ。

いそぎんちゃく [HomePage] 1999/12/01(水) 09:02:38
いろいろ、ありがとうございます。

>B-Cusさん
>http://japache.infoscience.co.jp/japanese_1_3/manual/misc/FAQ.html#ssi-part-iii
こういうページがあったのですね。これは、なにかと役に立ちそう。
># しかし、ひどい日本語だ。
最初、ワタシの書き込みが「ひどい日本語」だと言われてるのかと思ってアセりました。上記ページの話だったのですね(安心)。

>M.Nakawakiさん
さっそく見させてもらいました。
わざわざ、ありがとうさんです。
ところで、疑問に思ったとことがあるのですが、

(ここから引用)
# HTMLドキュメントのパス
$html_file = './test_1.html';

# HTMLドキュメントの中身を変数に格納(UNIXのcatコマンドを使っています)
# 私は簡潔に記述できるのでcatをよく使いますけど,お好み&環境でopen関数で読み込んでもいいです.
$html_doc = `cat $html_file`;

# HTMLドキュメントの最終更新からの時間(日数)を取得
$time = -M "$html_file";

# 得られた日数から更新時刻を割り出し,我々が普通に使う形式のデータに変換.
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - $time * 24 * 60 * 60);
@wday_array = ('日','月','火','水','木','金','土');
$year = $year + 1900;
$date = sprintf("%04d年%01d月%01d日(%s)%02d時%02d分%02d秒",$year,$mon+1,$mday,$wday_array[$wday],$hour,$min,$sec);

# SSIコマンド「<!--#flastmod file="./test_1.html"-->」を更新時刻のデータに書き換える.
$html_doc =~ s|<!--#flastmod file="./test_1.html"-->|$date|ge;

# 更新日時を挿入したドキュメントを出力.
print "Content-type: text/html\n\n";
print "$html_doc\n";

(引用ここまで)

ワタシの場合は、最初の「$html_file = './test_1.html';」を「$html_file = 'navigator.html';」に変え、「$date = sprintf("…」をお好みの形式に変えればいいのかなと思ったのですが、よく見るとその後に
$html_doc =~ s|<!--#flastmod file="./test_1.html"-->|$date|ge;
というのがあります。
これは、読み込んだnavigator.htmlの中に「|<!--#flastmod file="./test_1.html"-->」という記述があったら「$date」に置き換えるというものだと思いますが、実は当方が用意しているnavigator.htmlには、いくつもの「|<!--#flastmod file="xxxx.html"-->」があるのです(この書き込みのリンクを参照してください・ページの上部に表示されてるのがそうです)。
ということは、ここで、それを全部記述しないということですよね?

しかも、navigator.htmlで記述されているリンク先と更新日時表示のSSIは、将来変更されることがあるのです。
ということは、その時にまたCGIの中身も変更しなければならないということになってしまうのではないでしょうか????

#当方が希望していたのは、あくまでもnavigator,htmlの中身が変更になっても、それを呼んでいるHTML/CGIの中身を変更しなくても済むようなものだったので…。
#せっかく作ってもらったのにいろいろ言ってスミマセン。

いそぎんちゃく 1999/12/01(水) 09:39:26
自分で書いていて気づきましたが、

# SSIコマンド「<!--#flastmod file="./test_1.html"-->」を更新時刻のデータに書き換える.
$html_doc =~ s|<!--#flastmod file="./test_1.html"-->|$date|ge;

の部分を
・「<!--#flastmod file="」という記述が出てきたら、その後に出てくるファイル名だけ取り出し、更新日時をstatなどで所得
・foreachなどで繰り返す

という風にやればいいのかな?
#結構大変そう・・・・・。
#CGI重くならないかな・・・・・?
#そこまでして、やるほどのものなのかという気がしてきた・・・・・>ワタシ

[上に] [前に] [次に]