Cache-Control と Last-Modified を送信するように変更

このサイトは、ほぼ全てのページを「動的」なコンテンツとして配信しています。この日記や車歴表(w0s.jp) はもちろんですが、その他の一見「静的」に見えるコンテンツも、サーバー側でXMLをXHTMLに変換して出力しています。

  • 無駄と言われれば無駄です。なんとかしたいのですが、労力が…。

Apacheサーバーでは通常、静的なコンテンツにアクセスするとレスポンスヘッダに Last-Modified が自動的に付加されます。そのため、次回アクセス時にUAがキャッシュを保持しており、かつファイルが更新されていなければ304が発行され、無駄なトラフィックを抑えるようになっています。ところが、動的なコンテンツではこれを自動でやってくれないので、個別に実装しなくてはなりません。

ちなみに、RFC2616の14.29 Last-Modified(tools.ietf.org)

HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.

と書かれているように、 Last-Modified は可能であれば常に送らなくてはなりません。

というわけで、今さらながら実装してみました。基本的には、元ファイル(XML)の更新日時を取得して Last-Modified に充てていますが、日記の個別表示では該当記事の最終更新日時を充てるなど、なるべく不自然にならないようにしています。また、別途 Cache-Control: public も送信するようにしています。

これで、キャッシュを保持したブラウザが If-Modified-Since を含んだリクエストを行うと、コンテンツの更新日時と照らし合わせたうえで、変更がなければ304を返すようになります。

手持ちのブラウザで確認したところ、 Firefox、Google Chrome、IE、Opera は期待通りに If-Modified-Since 付きのリクエストを行ってくれたのですが、 Safari はどうやっても含んでくれず、常にサーバーから取得しなければならない状況です。それでも、単に今まで通りの動きをするだけなので、特に問題はないかと思いますが。

まあ Safari に限らず、おかしな動きがあるようでしたら連絡ください。