著作一覧 |
IEは、Last-Modifiedがレスポンスに入っている場合には、次回のリクエストにIf-Modified-Sinceを付ける。Last-Modifiedを最初に送らなければ当然送ることはできないからだ。
このときのリクエストはHEADではなくGETとなる。以前は最初にHEADを送ってきたような記憶があるが、今は304をGETに返せば良いから直接GETを寄越すのだと思う。
かつ、既定の状態だと、Last-Modifiedを送った場合は、最初の時点からキャッシュを積極的に利用する(ように見える。ETagに比較して)。
一方、Tomcat 5.5(他のバージョンは知らない)は、静的コンテンツの送信時にETagは付けるがLast-Modifiedは付けない。ETagはマルチホストのときに厄介とかいうより前に、アプリケーション的な操作を行うには便利ではないと書いて気づいたがTomcatは何を元にETagを設定しているのだろうか?(後で調べておこう)
それとは別にJEEのHttpRequest/Responseのヘッダ操作メソッドの時間の扱いの簡単さは異様。
というわけで、静的コンテンツをjspでくるんでやる。Tomcatから見ると動的コンテンツとなるのでETagは付かない。代わりに自分でLast-Modifiedを操作する。
// Content-Typeの設定など <% long lmod = File.new(target).lastModified(); response.setDateHeader("Last-Modified", lmod); if (request.getDateHeader("If-Modified-Since") >= lmod) { response.setStatus(304); } else { // If-Modified-Sinceが未設定なら-1が返るのでここに来る %> <jsp:include page="target"/> <% } %>
ジェズイットを見習え |