- - PR -
記事:事例に学ぶWebシステム開発のワンポイント(12)について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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)では以下のように規定されています。
つまり、サーバの現在時刻を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ページに表題の記事へのリンクがあるのですが その説明が前の回の説明のままのような・・・ | ||||
|
投稿日時: 2003-05-12 18:57
識者ではありませんが。
>2.RFC違反。クライアントの時刻まちがっていても面倒見るよ。 DateとExpiresが同一であれば本来キャッシュされないべきなのが、 ブラウザの実装によっては現在時刻とExpiresを比較しているものが あるということですよね? ということはRFCに違反しているブラウザを利用しているために サーバアプリケーションもRFCに違反しなければならないということで、 対応としては間違ってないと思います。 | ||||
|
投稿日時: 2003-05-12 22:07
zaxx_MDさん、ご回答ありがとうございます。
結論として私の最初の意見が間違っていました。 あれから再実験してみたのですが、 サーバより遅れた時刻に設定したクライアントから DateとExpiresが同一のコンテンツにアクセスしたところ みごとにキャッシュされませんでした。 結局、 4.そんなこと考えなくてもよい。おまえの記憶がおかしい。 ということでした。 この記事を見て困惑された方すみませんでした。 RFCどうりDateとExpiresを同一にすることでキャッシュされるのを 防ぐことができます。 |
1