- PR -

記事:事例に学ぶWebシステム開発のワンポイント(12)について

1
投稿者投稿内容
320
会議室デビュー日: 2003/05/11
投稿数: 3
投稿日時: 2003-05-12 02:21
はじめまして、320と申します。

表題の記事中でも述べられてますが
サーバで動的に生成したページをキャッシュさせないために
レスポンスヘッダにExpires,Pragma,Cache-Controlの値を設定することは
Webシステムを構築する際にはよく行われていると思います。

記事のサンプルコードの通りExpiresを設定すると
レスポンスの有効期限をあらわすExpiresはレスポンスが生成された時刻
(サーバの現在時刻)となり、レスポンス生成と同時に期限切れとなります。
よってWebブラウザではキャッシュされなくなります。

と、ここまではよいのですが、
この期限切れを判断するのがクライアント側なので
クライアント側のPCの時刻がサーバの時刻とずれていると
このキャッシュ禁止の仕組みが正しく動作しません。

具体的にはクライアントPCの時刻がサーバより過去になっていると
レスポンス生成時刻=キャッシュ期限切れ時刻としても
つづけて同じコンテンツを要求すると
クライアント現在時刻<キャッシュ期限切れ時刻となり
サーバにコンテンツを取りに行きません。

なので私の今まで経験したプロジェクトでは、
キャッシュ禁止を設定する場合は、Expiresに必ず過去の時間
例えば1970/01/01 00:00:00などを設定していました。
(この日付では必ず過去になるとは言い切れませんが・・・)

で、この記事をみて気になったのでRFCを調べてみました。

RFC2616(HTTP/1.1)では以下のように規定されています。

引用:
「レスポンスが "期限切れ" ということを表すためには、
オリジンサーバは Date ヘッダの値と同じである Expires の日付を送る」
http://www.studyinghttp.net/rfc_ja/2616/sec14.html#sec14.21



つまり、サーバの現在時刻をExpireの日付とするということで、
表題の記事でのHTTPレスポンスヘッダのつけかたはRFCに適ったものといえます。

ということは今まで私が行ってきた方法はRFC違反だったのですね(^^;
で気になるのが、みなさんどうしているのでしょうか。

1.RFC遵守。クライアントの時刻があってないのが悪い
2.RFC違反。クライアントの時刻まちがっていても面倒見るよ。
3.そんなこと考えなくてもよい。おまえのRFCの読み方が間違っている。

長文になってしまいましたが
識者の意見をお願いします。



※1 記事中のExpireの設定の仕方について
   SimpleDateFormatを使わなくても
   response.setDateHeader("Expires", System.currentTimeMillis()); で
   いいんじゃないかなと思ったり。

※2 HTTPに関するRFCについては以下のサイトを参考にしました。
    http://www.studyinghttp.net/

※3 JavaSolutionのTOPページに表題の記事へのリンクがあるのですが
   その説明が前の回の説明のままのような・・・
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-12 18:57
識者ではありませんが。

>2.RFC違反。クライアントの時刻まちがっていても面倒見るよ。
DateとExpiresが同一であれば本来キャッシュされないべきなのが、
ブラウザの実装によっては現在時刻とExpiresを比較しているものが
あるということですよね?

ということはRFCに違反しているブラウザを利用しているために
サーバアプリケーションもRFCに違反しなければならないということで、
対応としては間違ってないと思います。
320
会議室デビュー日: 2003/05/11
投稿数: 3
投稿日時: 2003-05-12 22:07
zaxx_MDさん、ご回答ありがとうございます。

結論として私の最初の意見が間違っていました。

あれから再実験してみたのですが、
サーバより遅れた時刻に設定したクライアントから
DateとExpiresが同一のコンテンツにアクセスしたところ
みごとにキャッシュされませんでした。

結局、

4.そんなこと考えなくてもよい。おまえの記憶がおかしい。

ということでした。
この記事を見て困惑された方すみませんでした。

RFCどうりDateとExpiresを同一にすることでキャッシュされるのを
防ぐことができます。
1

スキルアップ/キャリアアップ(JOB@IT)