問題: JavaScript の最終更新日時のスクリプトの動作がおかしい.
(現在時刻が出てしまう)
問題詳細: よくある下記JavaScript を使って最終更新日時を表示しようとするが,現在時刻が表示されてしまう.
(ブラウザで"更新"をする毎に変化する)
<SCRIPT LANGUAGE="JavaScript">
<!--
document.write(document.lastModified);
//-->
</SCRIPT>
調査結果1
確かに「設置するサーバーによってはうまく機能しない場合がある」
等書いてページがある
しかし,自分でapacheをコンパイルし設定したサーバでうまく動かないのは
どこか設定を変えればうまく機能するはず.
調査結果2
このスクリプトで表示している時刻はどっからとってきているのか?
telnet でデータを取得してみた.
> telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /index.shtml HTTP/1.0
HTTP/1.1 403 Forbidden
Date: Tue, 24 Feb 2004 03:55:22 GMT
Server: Apache/1.3.29 (Unix) mod_perl/1.29 DAV/1.0.3
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
(以下略)
どうやら,HTTPレスポンスの Date: ヘッダを参照しているようだ・・・
これは毎回かわる.取得した日時らしい・・
間違って表示される現在時刻と思っていたものと一致する
では,これをファイルの更新日時になるようにサーバの設定を変えればよいのか?
・・・・・そんな設定はなさそう
調査結果3
いろいろなページを見ていると,HTTPレスポンスヘッダに "Last-Modified:" というのがある!
本来JavaScriptは"Last-Modified:"ヘッダを見てそれを表示に,無いときに"Date:"ヘッダの値を表示するのではないか?
どうやら,そうらしい.
では,"Last-Modified:"ヘッダをHTTPレスポンスに含めさせるにはどうしたらよいか・・
いろいろ,調査したが,httpd.conf にはそのようなヘッダはない.
調査結果4
"Last-Modified:"ヘッダがつく場合とつかない場合の違いが発覚!
どうやら,Server Side Include (以下SSI) のファイルで出ないらしい.
参考
http://japache.infoscience.co.jp/japanese_1_3/manual/misc/FAQ.html#ssi-part-ii
調査結果5
SSI でも "Last-Modified:"ヘッダを付けさせるためには 「.htaccess」ファイルに
"XBitHack full"を記述すればよいらしい
(apache FAQより)
しかし・・・だめだった.
調査結果6
.htaccessファイルに"XBitHack full"の記述をするだけでなく,
さらに,該当htmlファイルのアクセス権として,chmod g+x 等をおこない
グループの実行権をつけなければならなかった.
>ls -l
-rw-r-xr-- 1 usera users 305 Feb 24 12:38 index.shtml
結果 ようやく成功!
> telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /index.shtml HTTP/1.0
HTTP/1.1 200 OK
Date: Tue, 24 Feb 2004 04:28:10 GMT
Server: Apache/1.3.29 (Unix) mod_perl/1.29 DAV/1.0.3
Last-Modified: Tue, 24 Feb 2004 03:54:58 GMT
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
(以下略)
最終調査結果報告
JavaScript の最終更新日時スクリプトで現在時刻が出てしまったら.
- telnet server 80 をしてHTTPレスポンスヘッダに "Last-Modified:" ヘッダがあるか確かめる.
- SSI か確かめる.
- SSIならば .htaccess に "XBitHack full" が記述されているか確かめる.
- さらに,ファイルのアクセス権限がグループに実行権があることを確かめる.
を確かめることで,SSIでも,普通のhtmlでも最終更新日時JavaScriptが動作させることができる.・・・はず^^
落ち
SSI でも,
<!--#config timefmt="%Y年%m月%d日"-->
<!--#flastmod file="this.html" -->
で最終更新日時が表示されるらしい・・・(涙)