mod_pagespeedで画像まわりで困った

サイトでのいくつかの画像については、mod_rewriteを利用して、

  • 特定ディレクトリに画像ファイルがあれば画像ファイルを利用する。
  • 画像フィルがなければ、データベースから画像を取り出し利用する。
    また、特定ディレクトリに画像ファイルを保存する。

のような処理をしています。

具体的な設定は以下のような感じです。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} images/items/(.*)\.(jpg|gif|png)$
RewriteCond /var/www/html%{REQUEST_URI} !-f
RewriteRule images/items/(.*) /imgdata/view?name=$1 [R,L]
</IfModule>

mod_pagespeedをデフォルトの設定で使っていると、images/items/以下の画像についてもmod_pagespeedが処理しようとして困ったことになります。
具体的には以下のような感じす。

例えば、HTMLソースが以下のような感じだとします。

<img src="/images/items/512f11042fa89.gif" />

mod_pagespeedを有効にしていると画像についても圧縮だとかの処理をしてくれるようになります。この際、mod_pagespeedはHTMLソースを

<img src="/images/items/512f11042fa89.gif.pagespeed.ce.BKX3EOmfxU.jpg" />

のような感じに修正します。このとき、mod_rewriteは512f11042fa89.gif.pagespeed.ce.BKX3EOmfxU.jpgが/images/items/以下にあるか探します。ない場合、512f11042fa89.gif.pagespeed.ce.BKX3EOmfxU.jpgをデータベースから取得しようとするのですが、同名のファイルはデータベースに登録されていないので失敗となるという感じです。

で、mod_pagespeedのマニュアルをみて、回避する方法がないか調べたところ、mod_pagespeedの設定ファイルで

ModPagespeedAllow *
ModPagespeedDisallow */images/items/*

のようにすると/images/items/以下については、処理の対象外にできることがわかりました。
ちなみに画像認証などをしている場合も同様の問題が起こると思うので、注意が必要です。