- 締切済み
最終更新日の表示
「index.shtml」というページから「b」というフォルダ内にある 「1.html」 「2.html」 「3.html」 への3つのリンクが張って張るんですが、「index.shtml」を表示させたときに 各リンク先ページの最終更新日を「index.shtml」に表示させたいのですが [an error occurred while processing this directive] と表示され更新日が表示されません。 自分なりに調べてssiで <!--#flastmod file="b/1.html" --> <!--#flastmod virtual="b/1.html" --> と言う形でやってみたのですが駄目でした。 レンタルサーバーは【エックスサーバー】 http://www.xserver.ne.jp/ で、ssiは使えるハズなんですが・・・ 表示出来ない理由など分からないでしょうか? また、ssi以外で指定したファイルの更新日時を別のページに自動で表示させられる 機能などないでしょうか? 私の作業環境はDreamweaverCS4でHPの構成はDreamweaverのテンプレート機能を使って作っています。
- みんなの回答 (10)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10359)
>最終行のコマンドは使えませんでした^^; >シンボルクリックというのを使えば可能なんですか? >でも、シンボルクリックの意味も分からない状態では避けた方が良いですよね^ No4に書いた通りPHPを使うのが楽だと思いますよ。リンクに書いたページは見ましたか? <!--#flastmod file="b/1.html" --> の部分を、 <?php echo date("F d Y H:i:s.", filemtime("b/1.html"));?> に変えて、htmlのファイル名を、 index.shtml から index.php に変えればOK。 日時表示の書式(上の例では "F d Y H:i:s." )は、下記を参照してください。 http://jp2.php.net/manual/ja/function.date.php
- ORUKA1951
- ベストアンサー率45% (5062/11036)
>ただ、私にはこれを理解実行するだけのスキルがありません^^; それは悔しいでしょうね。 でも難しくないので、試してみたら ポイント 1) CGIはtest.cgiとする。 2) 文字コードは簡単なShift_JISか現在のindex.htmlと同じにする。 3) 必要な箇所を訂正する my $fileNameA= '../Cutlery/index.html'; my $fileNameB= '../Cutlery/kitchenknives.html'; CGIの場所からのパス my $fileNameA= '../Cutlery/index.html'; my @timesA = localtime((stat $fileNameA)[9]); などは同じものを必要な数作成して適当に書き換える。$fileNameC、$fileNameD ファイルの適当な場所に[FILE_LAST_MOD_A]などを書き加えておく。 4) __END__の後にHTMLのソースをコピーペーストする。 5) サーバーに転送したら、パーミッションを755にする。 ★SSIよりはるかに高度なことができます。 #!/usr/local/bin/perl use strict; # ファイルの指定 my $fileNameA= '../Cutlery/index.html'; my $fileNameB= '../Cutlery/kitchenknives.html'; # ファイル情報の更新日時を取得して、時間に直す my @timesA = localtime((stat $fileNameA)[9]); my @timesB = localtime((stat $fileNameB)[9]); # 西暦に直す my $yearA = $timesA[5] + 1900; my $yearB = $timesB[5] + 1900; # 月に直す $timesA[4] ++; $timesB[4] ++; # 書式を整形する。 my $dateA = sprintf("$yearA-%02d-%02d %02d:%02d:%02d",$timesA[4],$timesA[3],$timesA[2],$timesA[1],$timesA[0]); my $dateB = sprintf("$yearB-%02d-%02d %02d:%02d:%02d",$timesB[4],$timesB[3],$timesB[2],$timesB[1],$timesB[0]); # ここからは、HTMLを読んで順次出力する。 print "Content-Type: text/html\n\n"; while(<DATA>){ s/\[FILE_LAST_MOD_A\]/$dateA (JST)/g; s/\[FILE_LAST_MOD_B\]/$dateB (JST)/g; print; } __END__
- ORUKA1951
- ベストアンサー率45% (5062/11036)
短くした・・・sprintfは配列から直接読めたはずだが/???忘れた。 それでも20行程度で済む簡単なものなのでよしとしよう。 PHPじゃこうも簡単にはいかないし、この方法だと他のファイルをいじらなくてすむ。 while(<DATA>){s///g; print;}は、結構使い回しが利くので、色々と応用が利くでしょう。 #!/usr/local/bin/perl use strict; my $fileNameA= '../Cutlery/index.html'; my $fileNameB= '../Cutlery/kitchenknives.html'; my @timesA = localtime((stat $fileNameA)[9]); my @timesB = localtime((stat $fileNameB)[9]); my $yearA = $timesA[5] + 1900; my $yearB = $timesB[5] + 1900; $timesA[4] ++; $timesB[4] ++; my $dateA = sprintf("$yearA-%02d-%02d %02d:%02d:%02d", $timesA[4],$timesA[3],$timesA[2],$timesA[1],$timesA[0]); my $dateB = sprintf("$yearB-%02d-%02d %02d:%02d:%02d", $timesB[4],$timesB[3],$timesB[2],$timesB[1],$timesB[0]); print "Content-Type: text/html\n\n"; while(<DATA>){ s/\[FILE_LAST_MOD_A\]/$dateA (JST)/g; s/\[FILE_LAST_MOD_B\]/$dateB (JST)/g; print; } __END__
- ORUKA1951
- ベストアンサー率45% (5062/11036)
No.2です。 間違えてました。 2) index.cgiをCGIとして実行させる。 ではなくて 2) index.htmlをCGIとして実行させる。 でした。これだと他のファイルや他のファイルに記述してあるトップへのリンクもそのままで良い。ただし、下位ディレクトリにindex.htmlがあると、それらはtext/htmlに変更する必要があります。 .htaccessをテキストエディタで作成して、同じディレクトリに置く。(改行まで) .htaccess <Files "index.html"> AddHandler cgi-script .html </Files> Perlのパス(下記は/usr/local/bin/perl)はサーバーに合わせること・・ #!/usr/local/bin/perl use strict; my $fileNameA= '../private/a.html'; my $fileNameB= '../private/b.html'; my $lastmodifiedA = (stat $fileNameA)[9]; my @timesA = localtime($lastmodifiedA); my $yearA = $timesA[5] + 1900; my $monthA = sprintf("%02d", $timesA[4]); my $dayA = sprintf("%02d",$timesA[3]); my $hourA = sprintf("%02d",$timesA[2]); my $timeA = sprintf("%02d",$timesA[1]); my $secA = sprintf("%02d",$timesA[0]); my $lastmodifiedB = (stat $fileNameB)[9]; my @timesB = localtime($lastmodifiedB); my $yearB = $timesB[5] + 1900; my $monthB = sprintf("%02d", $timesB[4]); my $dayB = sprintf("%02d",$timesB[3]); my $hourB = sprintf("%02d",$timesB[2]); my $timeB = sprintf("%02d",$timesB[1]); my $secB = sprintf("%02d",$timesB[0]); # ここから出力 print "Content-Type: text/html\n\n"; while(<DATA>){ s/\[FILE1_LAST_MOD_A\]/$yearA-$monthA-$dayA $hourA:$timeA:$secA (JST)/; s/\[FILE1_LAST_MOD_B\]/$yearB-$monthB-$dayB $hourB:$timeB:$secB (JST)/; print; } # プログラムはここまで・・ __END__ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=Shift_JIS"> <!-- ・・・【中略】・・・ __END__から、下に現在のindex.htmlをそのままコピーする。 更新日を入れるところに、キーワード(この場合[]の語句)を入れておく。--> <dl> <dt>FileA Last Modified</dt> <dd>[FILE1_LAST_MOD_A]</dd> <dt>FileB Last Modified</dt> <dd>[FILE1_LAST_MOD_A]</dd> </dl> ・・・【中略】・・・ <body> </html>
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
無駄レス失礼、認証でしたか。 アクセス権がないと無理ですね。 認証が必要なページの情報を、外から取得するというのはやったことがないのでわかりませんが、、、 CGIなら行けるんじゃないでしょうか?
お礼
ありがとうございます。 まだ勉強不足でcgiなどプログラムなど分からないので今回は認証フォルダ内で 機能するようにページ構成を変えてみます。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
<!--#flastmod file="b/1.html" --> <!--#flastmod virtual="b/1.html" --> XServerを利用させて貰ってるのでテストしてみましたが、上記の書き方で表示できました。 考えられそうな原因は、 ・b/1.htmlがない(パスが間違っている、アップロードしわすれなど) ・b/1.htmlにアクセス権がない ・該当箇所以外のSSIコマンドのエラーを見間違えている ・全角スペースが混ざっている ・l(小文字エル)とI(大文字アイ)などのスペルミス ・.htaccessに何らかのエラーがある ・.htaccessでXBitハックの設定があり、htmlファイルに実行属性が付いていない などでしょうか。 最後の2つは単純にSSIとして実行できない(InternalServerErrorになるか、ブラウザでアクセスしてHTMLコードを見るとHTMLコメントとして入っている)だけだと思いますが。 SSIで文法があっている場合、どこに原因があるか、現物(.htaccess含め)を見てみないとわからないですね。
- notnot
- ベストアンサー率47% (4900/10359)
SSIでなくてもいいんですね。見落としてました。 CGIでも良いですが、PHPにするのが簡単だと思います。 http://www.php.net/manual/ja/function.filemtime.php
- notnot
- ベストアンサー率47% (4900/10359)
>認証がかかっていると更新日時を呼び出すのは無理なんでしょうか? 無理です。 認証のかかってないディレクトリに、b/1.html へのシンボリックリンクを置いてそれを参照するなどすれば可能です。ftpでアップロードするしかサーバー上のファイルを更新出来ないとすると無理かな。 SSIのexecが使えて、サーバーがLinuxなら、以下で可能ですが、これも無理かな? <!--#exec cmd="date -r b/1.html" -->
お礼
最終行のコマンドは使えませんでした^^; シンボルクリックというのを使えば可能なんですか? でも、シンボルクリックの意味も分からない状態では避けた方が良いですよね^^;
- ORUKA1951
- ベストアンサー率45% (5062/11036)
様々な方法があります。 basic認証のかかっているディレクトリ内のファイルをもその外からSSIで開くことはできません。事前に許可を与えられていると可能かも・・ 様々な方法があります。 1) DIRECTRY INDEXをindex.cgiを最初に持ってきて、トップページをindex.cgiないし、ディレクトリ名でindex.cgiが実行されるようにする。 2) index.cgiをCGIとして実行させる。 3) 認証ページのプログラムから、非認証ディレクトリ内に自動的に小さなファイルをコピーさせ、それを調べる。 可能なら簡単なのは(2)かな・・下位ディレクトリの設定は別途戻す必要はありますが・・
お礼
ありがとうございます。 やっぱ認証があるとssiでは無理なんですね^^; まだ勉強不足でプログラムなど分からないので今回は認証フォルダ内で 機能するようにページ構成を変えてみます。
- notnot
- ベストアンサー率47% (4900/10359)
b/ に認証がかかっているとか?
補足
あ、、そういえば「b」は会員専用でベーシック認証がかかっていました^^; (「index.shtml」のあるフォルダはルートフォルダで認証されていません) 認証がかかっていると更新日時を呼び出すのは無理なんでしょうか?
お礼
すごく細かく教えていただきありがとうございます。 ただ、私にはこれを理解実行するだけのスキルがありません^^; 今回は認証フォルダ内で機能するようにページ構成を変えてみます。 これからもっと勉強していつか使えるように頑張ります^^