最近のイケているプログラマってのはGitHubで書いたソースを共有して、Qiitaで技術ブログを書くものらしい。まぁ、僕は全然イケてないのでなんでもごちゃ混ぜの雑記ブログで技術情報まで書く。元々は僕のブログは技術ブログだったのだが、思いつきをなんでも書いているうちに物置小屋の様なカオスになってしまった。だが、元よりプログラマというのは物を書くのが好きな人種である。webの原住民は、僕の様なIT業界従事者である。
今日はお仕事でiPhoneのSafariでキャッシュが消えずに随分と苦労をしたので、情報共有の意味でメモを残しておこう。PCのブラウザならば普通にno-cacheを使えば対応出来るんだけど、iPhoneのSafariはなんか仕様が変。
基本的にはキャッシュ周りの設定はPHPのheader関数を使って設定してやれば良いと言われているが、iPhoneのSafariではそれではできなかった。試行錯誤した方法も含めて情報共有の意味でまとめておこう。
<?php // キャッシュさせないようにheader追加 header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: '. gmdate('D, d M Y H:i:s') .' GMT'); header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache');
Expiresはキャッシュの期限。これが切れているとサーバに読み込みに行く。
Last-Modifiedは同じファイルかどうか比較するための検証子。最後に改変された日付時刻を設定。
Cache-Controlはキャッシュの設定。
Pragmaもキャッシュの設定。
後、PHPのheader関数は全ての出力の前に置かないとエラーになるので気をつける様に。
いちおー、上記の処理を組み込めば通常のブラウザのキャッシュは回避出来るんだけど、Safariに関しては全く効かない。
最終的にはjavascriptで読み込み時に強制リロードをかけるように設定してやれば行けるようだ。
window.onpageshow = function(event) { if (event.persisted) { window.location.reload() } };
takaaki-kasai-tech.blogspot.jp
注意点としてはjQueryではなくて生のjavascriptじゃないと効かない。また、headタグの間で読み込ませないと効果が無い。
検証は十分にはしてないけど大体これでいけるかと。