Очень не люблю пытаться вслепую искать причину неработоспособности чего бы то ни было. Вот и сейчас. Убил по меньшей мере час, пока не узнал, в чём же дело.
Ситуация. Сервер сайта генерирует файл и пытается отдать его как статику, задействовав заголовок ETag
. Реализовывается вся необходимая логика с возвратом 304
и поглядыванием в if-none-match
. Но в итоге упираюсь в то, что браузер в упор не видит ETag
заголовок. Первым делом полез смотреть заголовки в curl -v
. Но заголовок возвращается. Начинаю ковыряться в разных статьях про ETag
на предмет подводных камней. Ничего не нашёл, всё должно работать просто и надёжно. Пробую в разных браузерах. Они в упор не видят заголовка. Начинаю эксперементировать со значением заголовка, расположением в списке других заголовков, прочей чертовщиной заниматься. Очередной подход к google
-у выдал мне причину.
Оказалось, что дело в том, что в конфигурации хоста nginx
у меня прописано сжимать GZip
-ом все ответы с определённым content-type
-ом. А nginx
при этом срезает ETag
. Именно поэтому я видел заголовок в ответе curl
-а, но не видел в браузерах. Поправил конфиг ― заработало.
Помимо прочего, я некоторое время не мог завести базовый механизм работы Last-Modified
. Браузер упорно не хотел кешировать файл, несмотря на наличие всех необходимых заголовков. Оказалось всё дело в формате даты. Найденные мною быстрые решения для momentjs
были кривыми, и браузер их не понимал. В конце некоторых дат указывалось смещение в виде +00:00
, и всё ломалось.