2008-09-18

Jaxer Server (mod_jaxer) と Apache Etag と Last-Modified の矛盾を解消せよ

Aptana からダウンロードできる Jaxer のアーカイブ には Apache HTTP server も含まれますが、そのアーカイブをそのまま使うと、Apache の Etag と Last-Modified が働いてしまい、Jaxer Server (mod_jaxer) の動的コンテンツのキャッシングに矛盾が発生してしまいます。

どういうことかというと、次のような HTTP レスポンスヘッダ(抜粋)が返ってきます。Expires、Cache-Control、Pragma ヘッダで、ブラウザにキャッシュするなという一方で、Last-Modified と Etag ヘッダで、キャッシュを促すようにもしています。

HTTP/1.x 200 OK
Server: ModJaxer/0.9.7.2472 Apache/2.2.4
Expires: Fri, 23 May 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Last-Modified: Wed, 17 Sep 2008 13:42:10 GMT
Etag: "351aa-3f1b-a2952661"

これは Jaxer Server (mod_jaxer) が、Apache のフィルタとして機能することに起因しています。Jaxer Server は、動的コンテンツを生成しているつもりでも、Apache は静的コンテンツを扱っていると認識しているという矛盾です。

IE7 や Opera は Last-Modified を優先するらしく、このまま使うと、HTML ファイルの最終更新日に応じてキャッシュが効いてしまい、ページ遷移したり、リロードしたりしても、動的コンテンツにも関わらず、304 Not Modified になってしまいます。

また、プロキシを介している環境であれば、ブラウザによらず、そのプロキシの振る舞いに影響を与えるかもしれません。

本来なら Jaxer Server (mod_jaxer) で Etag と Last-Modified を制御すべきなんだろうと思うのですが、[#JXR-308] Remove ETag and 'Last-Modified" response headers - ASAP - The Aptana Issues Tracker のとおり、Jaxer Server で何か対応するつもりはなさそうです。

ですので、Apache の設定で対応することになります。その一例は、次のとおりです。

FileETag ディレクティブを使って ETag ヘッダを送出しないようにしています。Header ディレクティブを使って Last-Modified ヘッダを送出しないように除去しています。すべての HTTP レスポンスに適用する必要はないので、FilesMatch を使って、Jaxer Server がフィルタするコンテンツのみに適用すればいいでしょう。

FileETag None
<FilesMatch ".\html">
Header unset Last-Modified
</FilesMatch>

なお、ここで扱った Aptana Jaxer のバージョンは 0.9.7.2472 (Linux) です。ですので、公開中の 1.0.0 RC B では改善されているかもしれません。

0 件のコメント: