Re: Bug – 304 status - Cache-Control

S.A.N nginx-forum at nginx.us
Mon Jan 6 08:35:26 UTC 2014


> > 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{}, это возможно сделать?

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,245951,246054#msg-246054



Подробная информация о списке рассылки nginx-ru