Apache2.2 PHPで生成の画像・JS・CSSのブラウザキャッシュ

ブログ | 2010/2/20 01:06
以前に「PHPで生成したCSSなどをキャッシュする。」
http://www.rottel.net/kuwa/3126
というメモを書いたのだけれど、昨日ふとブラウザキャッシュが効いてないことに気がつきました。なんてことだ。(ブロードバンドのせいにしといてみる)

それに気がつくと、帯域を使いすぎている原因がソレだということで、いろいろ合点がいきました。

awstatsで見ると、去年の8/25からガツンと転送量が増えていて、ちょうどそのころ新しいmacminiにメインサーバーを交換したことから、その時にapache2からapache2.2にしてたんじゃないかと思い当たります。

今回検索してみたら、apache2.2でキャッシュ関係が強化されたのは、常識みたいです。

まず、下記ページを参照して、httpd.confにExpires関係を追加
http://bali.sakura.ne.jp/サーバー/apache-cache-contr...

ExpiresActive On
ExpiresByType text/css "access plus 100 days"
ExpiresByType application/x-javascript "access plus 100 days"
ExpiresByType image/gif "access plus 100 days"
ExpiresByType image/jpg "access plus 100 days"
ExpiresByType image/jpeg "access plus 100 days"
ExpiresByType image/png "access plus 100 days"

<FilesMatch ".(ico|jpg|jpeg|png|gif|js|css|swf|mov)$">
 Header set Cache-Control "max-age=8640000"
</FilesMatch>

で、PHPの出力でキャッシュを有効にする記述
例えば、jpegの場合は、
<?php

if(array_key_exists("If-Modified-Since", apache_request_headers())){
 header("HTTP/1.1 304 Not Modified");
 exit();
}

header('Content-Type: image/jpeg');
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");

?>
ブラウザから、If-Modified-Sinceがリクエストされた場合は、304だけを返して終了させてしまうのである。

ということで、様子見中。
▼追記 2010/2/20 14:48
ExpiresByType text/plain “access plus 30 days”
ExpiresByType text/html “access plus 30 days”
この辺りを入れると、PHPでのhtml出力もheaderにmax-ageが入り、キャッシュされてしまったので、削除。

なんとなく分かったこと、
ExpiresByType で設定すると、phpでのjs出力などには、headerにmax-ageが入るけれど、普通のtest.jsなどには入らない。

普通のファイルには、FilesMatchでファイル名を選び、
Header set Cache-Control "max-age=8640000"
で、 headerにmax-ageを入れる。

ということで、更に様子見。
変な挙動がでていたら、リロードしてみて下さい。
▼追記 2010/2/22 22:37
転送量、まったく改善されてない。なぜだ。

リンク元

縮小 拡大

ログインしておくと、後で編集が可能です。

Rottel内コンテンツ

アーカイブ
コメント
ツイッカー
アンケート
デイリーRottel
ブログ
写真
フィードバック
ブックマーク
マップ
タグ
手当たり次第

ユーザー一覧

Rottelとは?
利用規約
開発飲料
利用者の声
ヘルプ
close