Cache-Control Expires

キャッシュについて整理 #キャッシュ - Qiita 2018

静的ファイルのキャッシュコントロールについて ISUCON7 - バカンス駆動開発 2020

【WordPress】mod_expires 設定でパフォーマンス改善♪ – oki2a24 2013

Cache-Control

Cache-Controlヘッダがないときもブラウザがキャッシュする!?

no-cache

2. no-cache
オリジンサーバーの確認無しに勝手にキャッシュしてはいけない。つまり、勝手に再利用するな!毎回聞きに来い!ノー、キャッシュ!!
キャッシュさせたらあかーん!ヘッダーの設定方法 - IDCF テックブログ

Cache-Control: no-cache はキャッシュしないわけではない
Cache-Control: max-age=0, must-revalidate は Cache-Control: no-cache と書いても同じです。
Netlifyのデフォルトキャッシュ設定はどう振る舞う? | DevelopersIO

キャッシュサーバ対策

プロキシキャッシュ対策
HTTP/1.1 にはこの問題に対処するための Cache-Control ヘッダが用意されている。次のような Cache-Control ヘッダをHTTPレスポンスに記述することによって、Webアプリケーションからブラウザに送るコンテンツが、途中の経路上でむやみにキャッシュに記録されたり再利用されたりしないように、プロキシサーバやキャッシュサーバに指示するというものである。

  • Cache-Control: private

Webサーバから返されるコンテンツがただ一人のユーザのためのものであることを示す。このコンテンツは、複数のユーザが共有されるキャッシュに記録されるべきではないことを表している。ただし、これは、一人のユーザのみが利用するキャッシュ(ブラウザのキャッシュ等)への記録を禁じるものではない。Cache-Control: private のみが指定されている場合、何らかのキャッシュへの記録が行われるおそれがある。

  • Cache-Control: no-store

このヘッダは、Webサーバから返されてくるコンテンツをキャッシュに記録するな、という指示である。

  • Cache-Control: no-cache

一見「キャッシュを使うな」のように見えるこのヘッダが実際に意味するところは少々ニュアンスが異なる。このヘッダの意味は、いちどキャッシュに記録されたコンテンツは、現在でも有効か否かを本来のWebサーバに問い合わせて確認がとれない限り再利用してはならない、という意味である。

  • Cache-Control: must-revalidate

このヘッダは、キャッシュに記録されているコンテンツが現在も有効であるか否かをWebサーバに必ず問い合わせよ、という指示である。
これらのヘッダを適宜取捨選択して使用することになるが、これらをすべて指定して次のようにしても構わない。

  Cache-Control: private, no-store, no-cache, must-revalidate

https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/405.html

ETag

  • ブラウザにて、コンテンツに対するHashを持ち、これを最新のコンテンツ要求時に添える。
  • サーバ側は送られたHashと最新のコンテンツのHashを比較し、更新の有無をクライアントへ返却する。
  • 更新が無ければコンテンツは返送しない。

ETagとは #ETag - Qiita 2022

Apache 2.4 deflate ETag

2.4.58 (2023/10/19) でDeflateAlterETag追加

mod_deflate: ETag がどのように変更されるかをコントロールする DeflateAlterETag が追加されました。’NoChange’ パラメータで 2.2.x の動作を模倣します。(PR 45023, PR 39727)
https://www.sraoss.co.jp/tech-blog/apache-httpd/rn-2-4-58/

〜以下、古い情報

対策
 どうも、mod_deflate でコンテンツを圧縮してレスポンスした際、ETag の末尾に付く -gzip という suffix が悪さをしているらしい。Apache 2.5 の mod_deflate から、この suffix を調整する DeflateAlterETag というディレクティブが追加されたようで、これ一発で解決しそうですが、Apache 2.4 ではまだ使えないんですね。
Apache 2.4 Web サーバで 304 Not Modified が返ってこない - Open MagicVox.net 2017

DeflateAlterETag ドキュメントだと

DeflateAlterETag Directive
Compatibility: Available in Apache 2.4.42 and later
https://httpd.apache.org/docs/trunk/en/mod/mod_deflate.html

だが、公式の2.4にバックポートされてない
https://bz.apache.org/bugzilla/show_bug.cgi?id=45023#c25
2.4.54のソースでも確認

https://svn.apache.org/viewvc?view=revision&revision=1586542
の mod_deflate.c の差分を適用すると DeflateAlterETag が使用できるようになった。 (パッチは微修正が必要)

Chromeのリロードで If-None-Match 送信、304応答確認
※ スーパーリロードだと If-None-Match を送信しない
Safariのリロードは304にならなかった

redhatがバックポートしている例
https://issues.redhat.com/browse/JWS-617
https://access.redhat.com/documentation/ja-jp/red_hat_jboss_core_services/2.4.37/html/red_hat_jboss_core_services_apache_http_server_2.4.37_release_notes/_resolved_issues

cp patch-modules_filters_mod__deflate.c /usr/ports/www/apache24/files/

cd /usr/ports/www/apache24

sudo pkg unlock apache24
sudo make
sudo make reinstall
sudo pkg lock apache24

sudo /usr/local/etc/rc.d/apache24 configtest
sudo /usr/local/etc/rc.d/apache24 restart