at posts/single.html

キャッシュと Last-Modified の関係

tDiary に認証機能を組み込む実験をしてから二ヶ月経つ。 日記のナビゲーションにログイン/ログアウトボタンを付けたんだけど、一つ問題があった。 それは、ログアウトした後でもナビゲーションに「ログアウト」ボタンが表示されたままになるということ。 本当はログアウト後は「ログイン」ボタンが表示されるはずなのに。

少し時間ができたので、 HTTP ヘッダの内容をキャプチャして調べてみた。 結論としては、ログインの前後で同じ Last-Modified を返しているので、ブラウザのキャッシュが使われているのが原因だった。

「tDiary のトップページを表示」→「ログインボタンを押してログイン画面を表示」→「ログイン画面にIDとパスワードを入れてログイン」までを実行したところからキャプチャをスタート。

トップページの表示(ログイン後)

ログインした後にトップページを表示したときのヘッダ。

GET /sample/tdiary-auth/ HTTP/1.1
Host: www.machu.jp
(略)
Cookie: _session_id=24c72f72c8abd6e403df911fb3099476
HTTP/1.x 200 OK
Date: Sat, 26 Aug 2006 16:22:15 GMT
Server: Apache/1.3.37 (Unix)
(略)
Set-Cookie: _session_id=24c72f72c8abd6e403df911fb3099476; path=/sample/tdiary-auth
Last-Modified: Wed, 21 Jun 2006 07:00:25 GMT

帰ってきた画面には、ナビゲーションに「ログアウト」ボタンが含まれている。 レスポンスの Last-Modified に注目。 これは、コンテンツ(日記)が最後に更新された日時になる。 Web ブラウザはこの情報を使って、キャッシュを使うかどうかを判断する。

ログアウト

ログアウトボタンをクリックしたときのヘッダ。 まぁ、ここは本題じゃないのでどうでもいい。

GET /sample/tdiary-auth/?logout=true HTTP/1.1
Host: www.machu.jp
(略)
Cookie: _session_id=24c72f72c8abd6e403df911fb3099476
HTTP/1.x 200 OK
Date: Sat, 26 Aug 2006 16:22:22 GMT
Server: Apache/1.3.37 (Unix)
(略)
Set-Cookie: _session_id=24c72f72c8abd6e403df911fb3099476; path=/sample/tdiary-auth

トップページへ戻るためのリダイレクト画面(Wait or Click here! の画面)なので、レスポンスに Last-Modified ヘッダは含まれない。 ちなみに、ログアウトだから本来はセッション Cookie を削除すべきだけど、僕が実装をサボっている。

トップページの表示(ログアウト後)

リダイレクト画面を受信すると、自動的にトップページを取得しに行く。

GET /sample/tdiary-auth/ HTTP/1.1
Host: www.machu.jp
(略)
Cookie: _session_id=24c72f72c8abd6e403df911fb3099476
If-Modified-Since: Wed, 21 Jun 2006 07:00:25 GMT
HTTP/1.x 304 Not Modified
Date: Sat, 26 Aug 2006 16:22:23 GMT
Server: Apache/1.3.37 (Unix)

Web ブラウザからのリクエストに「If-Modified-Since」ヘッダが送られている。 これは、ログイン後にトップページを表示したときに、レスポンスに含まれていた Last-Modified と同じもの。 「07:00:25 以降に更新されていたら新しいのをください」と要求している。

これに対して、サーバからは「304 Not Modified」として、「ページは更新されてないよ」というレスポンスが返ってきている。 確かに、ログイン前後で変わるのはナビゲーションのボタンだけで、日記が更新されている訳じゃない。 だから、この動作自体は間違っていない。 とはいえ、ボタンの内容は変わってくれないと困る。 Last-Modified ヘッダを返さないようにすれば問題は解決するけど、それじゃ根本的な解決にはならない。

関連する日記