> > fastcgi_cache_key "$host$uri$is_args$args";
>
> Это ни разу ни баг - это вы недонастроили.
>
> Добавьте в ключ кеширования параметр
> $http_if_modified_since
> и наступит вам счастье.
Я наверно не доступно объяснию суть проблемы.
Попробую объяснить на пальцах :)
Есть uri
/user/bar
Отдает контент с заголовками
Cache-Control: private, max-age=0
Это клиенское кеширования, с постояной ревалидацией на бекенде.
Даные заголовки запрещают Nginx кешировать страницу, никаких файл кеша в Nginx не создаётся её кеширует только браузер, нам это и нужно на данном uri.
По этому в нашем конфиге прописана передача от клиента к бекенду заголовков кеширования, чтобы бекенд мог ревалидировать кеш клиента.
Вот эти строки
fastcgi_param HTTP_IF_NONE_MATCH $http_if_none_match if_not_empty;
fastcgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since if_not_empty;
Это работает отлично, но дело в том что эти строчки конфига ломают Nginx кеширования, из-за них появляется баг с кешированием 304 статуса.
Отключить Nginx кеширования тоже не можем потому что на других uri мы используем Nginx кеширования, например uri
/news/list
Отдает контент с заголовками
Cache-Control: public, max-age=1
Эта страница должна попадать в кеш Nginx.
Имино с этой страницей и будут проблемы, если в папке кеша Nginx удалится файл кеша, и прийдет запрос от браузера с актуальным заголовками If-Modified-Since и If-None-Match, на этот запрос бекенд ответит 304 статусом и вернет заговок Cache-Control: public, max-age=1, в результате чего 304 ответ попадет в кеш Nginx.
Добавлять в ключ кеша заголовки If-Modified-Since и If-None-Match бесмыслено, потому что это не решит проблему просто создаст разные файлы кеша с той же проблемой, если кто-то не верит пусть проверит.
Что имеем в итоге, директивы
fastcgi_param HTTP_IF_NONE_MATCH $http_if_none_match if_not_empty;
fastcgi_param HTTP_IF_MODIFIED_SINCE $http_if_modified_since if_not_empty;
ломают кеширования Nginx но дают возможность работы с клиент кешированием, если убрать эти дерективы тогда нормально работает Nginx кеширования, но пропадает возможность работы с клиент кешированиям.
Нам надо что бы клиент и Nginx кеширования и клиент работали в рамках одного server{}, это возможно сделать?