11時23分03秒 [Web関連]
たいていのブラウザには、通信量を削減して表示速度を向上させるために、一度ダウンロードしたデータはローカル(HDDなど)のキャッシュ領域に一定期間ほど保存しておく機能があります。ユーザが表示を指示したデータ(HTMLやCSSや画像など)がキャッシュ領域にあれば、サーバからはダウンロードせずにキャッシュ領域に保存してあるデータをそのまま表示する仕様です。
キャッシュ領域に保存してあるデータを読ませずに、強制的にサーバからダウンロードし直させるには、単に「再読込」をすれば良いだけです。たいていは、F5キーを押すと(構成ファイルを含めた)ページ全体の再読み込みができます。もちろん、ツールバー上の「再読込(リロード)」ボタン等を押しても構いません。
時々キャッシュが強く効いている場合もあって、単に再読込するだけでは更新されない場合もありますが。そのときは [Ctrl]+[F5]キーを押してスーパーリロードすれば全ファイルが読み込み直されます。
で、このキャッシュ機能は、通常、ブラウザを使う際には便利でありがたい機能ではあります。……が、ウェブ製作現場では少々困ることがあります。
ウェブ製作では、こちら側とクライアント(依頼者)側とで、以下のようなやりとりが頻繁に行われます。
➡こちら「こんな感じでウェブページを作りましたがどうですか?」
➡依頼者「この部分をもうちょっとこんな感じにして下さい」
で、指示通りに修正した結果をお知らせしたとき、
➡こちら「ご依頼頂いたように修正してみましたがどうでしょうか?」
➡依頼者「……全然変わってないように見えるんですが」
こういった反応はよくあります。
この原因が、ブラウザのキャッシュ機能です。
短い期間で同じページを表示させた場合、HTML内で呼び出されているCSS・JavaScript・画像等の各ファイルは、サーバからはダウンロードされず、ローカルのキャッシュ領域に保存されたデータが読まれる可能性が高いです。
その結果、「どこも修正されていない」ように見えてしまうわけです。
こういう反応には頻繁に遭遇するので、修正報告メールには必ず「もし変わっていないように見えたらそれはキャッシュのせいだからページ自体を再読込させて下さい」のような意味の文章を書き加えます。同じ方には一度しか言わないなどということはなく、毎回毎回書き添えます。
場合によっては、「ブラウザに搭載されているキャッシュ機能とは何か?」、「どういう利点があってキャッシュ機能がブラウザにあるのか」、という点から説明をします。(^_^;) そもそも「キャッシュ」と言っただけでは伝わらないことが多いですから。
というわけで、なかなか面倒なのですよね。
ブラウザがデータを一切キャッシュしないようヘッダに書いておく手もなくはないんですが、それだと「本当に更新していないファイル」も毎回読み込み直されることになります。それだと無駄な通信が多くなってしまいますし、そのページの構成によっては重たく感じられる要因になるかも知れませんし、避けておきたい方法です。
そもそも、(ウェブページの表示速度の向上のためにも)更新していない間は極力キャッシュから読み込んで、無駄にダウンロードしないようにしてくれる方が望ましいわけですから、キャッシュを拒否したりキャッシュ期間をすごく短く設定しておく対処方法は避けたいです。
で、実は、最近気付いたんです。
もしかしたら、ずいぶん前から業界ではとっくに使われていたのかも知れませんが。恥ずかしながら、私は最近になって、ようやく気付きました。(^_^;;;
例えば、HTMLからCSSファイルを読み込む際は、以下のように記述しますよね。(CSSファイル名が styles.css の場合)
これを、以下のように変更します。
URLの末尾にクエリを付加しています。
上記では、「CSSのファイル名」の直後に「?」記号を書いて、その後に適当な文字列を加えただけです。
文字列は何でもいいんですが、目的から考えると日時を記述しておく方が良い気がします。
URLの末尾に「?」記号を加えて続ける文字列は「クエリー/Query」と呼ばれるもので、CGIやPHPなどのプログラムにデータ(指示)を送る目的などで使われます。
例えば、掲示板で123件目の投稿を表示するURLが www.example.com/bbs/show.cgi?msg=123 だったりとか。この場合、ブラウザが呼び出しているファイルが show.cgi で、そのCGIに送っているデータ(指示)が msg=123 の部分です。CGIは、その「msg=123」の部分を解釈して、適切なデータ(HTMLなど)をブラウザに返します。
WordPressをデフォルトの設定で使うと、ページのURLも www.example.com/?p=123 みたいな感じになりますよね。この「?p=123」も同じです。
このクエリー(=「?」記号とそれに続く文字列)は、HTMLやCSSなど、動的には変化しないデータの末尾に加えても特に影響はありません。
……等々、どう書いても、示している(表示される)のは page.html です。
しかし、ブラウザは、これらを異なるURLだと見なします。
なので、「?」以降の文字列が異なれば、ブラウザはキャッシュデータを読みません。
ここがポイントです。
というわけで、例えばCSSを読み込ませる際のURL(ファイル名)は、以下のように「?」+「更新日時」の法則で文字列を加えて記述しておき、
このCSSを更新したときには、「?」以降の日時の部分を書き換えます。
このように、更新する度に書き換えれば、キャッシュを読まれる心配はありません。
依頼者(クライアント)側のOKが出た時点で、
のように、何も付けないURLにすれば良いでしょう。
(まあ、付けたままにしておいても害はありませんが。)
というわけで、つい最近この事実に気づいて、今ではこの方法を使っています。
……もっと早く気づきたかった……。(^_^;;;
この日記へのコメントはお気軽に! コメント数:15件
(前の記事) « iPhoneとiPod touchのモデルを比較する
前後のエントリ
< 旧 / 新 >
キャッシュの存在をいちいち説明するのも手間ですからね~。(^_^;)
こちら側で対策ができるなら、そうしておく方が余計な手間が掛からなくて望ましいですよね。
投稿者 にしし : 2017年08月04日 13:47
ありがとうございます。ありがとうございます。ありがとうございます。大変役に立ちました。
投稿者 Anonymous : 2019年03月19日 17:42
お役に立って良かったです。(^_^)b
投稿者 にしし : 2019年03月20日 14:23
とても参考になりました。ありがとうございます。
投稿者 pew : 2019年10月10日 11:55
お役に立って良かったです。ぜひ活用してみてください。(^_^)
投稿者 にしし : 2019年12月28日 21:23
ありがとうございました!
とても助かります!
投稿者 グリン : 2021年02月23日 21:41
お役に立って良かったです。これ2013年の記事なんですが、ちょくちょく反応があるというのは、やはりブラウザのキャッシュ機能によるこの問題についてはWeb製作業界あるあるな事柄なのでしょうね。^^;
投稿者 にしし : 2021年02月27日 16:14
目からウロコの方法でした!
ありがとうございました。新しいファイルがないですよ~、という苦情がたくさん来てたので助かります。
投稿者 はっぽう : 2021年07月01日 12:55
お役に立ったようで良かったです。(╹◡╹)ノ
投稿者 にしし : 2021年07月03日 13:34
cssではなく、記載内容がスーパーリロードをしないと更新されません…。
トップページのhtmlに対して反映させられますか?
投稿者 MF : 2021年08月08日 17:23
MFさん、こんにちは。
その場合は、もしかしてブラウザ側ではなくサーバ側のキャッシュが効きすぎているのではないでしょうか。サーバのコントロールパネル等からキャッシュの設定を見直してみると良いかもしれません(例えば、ロリポップ!アクセラレータとか)。もし自力で .htaccess ファイルにキャッシュの設定を書いているなら、その内容を見直してみて下さい。
なお、トップページのHTMLでも、案内するURLにクエリ文字列を付加することはできます。検索サイトやブックマークからのアクセスには意味がありませんが、「直接クライアントさん等に『このURLから確認して』と言う」方法なら、キャッシュを無視して最新のページを見せられます。単にURLの末尾に「 ?d20210810 」のような適当な文字列を付けるだけです。
投稿者 にしし : 2021年08月10日 10:40
返信ありがとうございます。
サーバ側の設定も絡むんですね。使用環境的にサーバ設定は難しいので、教えて頂いた「?」の方法でやってみると、できました!
なんとか自動化できないかと考え、日付をscriptで取得してページ内のリンクには最後尾に「?」+閲覧日が追記された形にしました。
これでひとまずページ内のリンクを叩けば、1日単位で読み直してくれる動きになればいいなと思います。
m(__)m ご教示感謝します。
因みに、モバイル端末では最初の段階で(?を付けなくても)更新されていました(PCと動きが違いました)。
投稿者 MF : 2021年08月11日 01:49
モバイルで問題なかったのなら、やはりブラウザ側のキャッシュの問題ですね。(同じPCでも、普段ご使用ではない別のブラウザでアクセスしてみればハッキリします。)
投稿者 にしし : 2021年08月12日 17:19
個人的には日付よりもバージョンを書きたい派です
"path/to/resource?version=1.0.0-SNAPSHOT-0"
といった感じでバージョンが重複した場合は後ろに数字をつけるのもよさそうです
投稿者 りすりす : 2021年10月01日 00:22
コメント数: 15件
大変参考になりました。使わせていただきます。
投稿者 Anonymous : 2017年06月14日 11:33