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