Назад | Перейти на главную страницу

nginx не возвращает 304 для кешированного содержимого

Я использую nginx в качестве обратного прокси с серверной частью Apache, обрабатывающей некоторые файлы PHP.

Файлы возвращают правильные заголовки с истечением срока действия, и proxy_cache хорошо их кэширует, но я заметил, что кэшированный контент возвращает 200 при каждом обновлении, когда было бы более эффективно возвращать 304 для кешированных файлов.

Рассматриваемые файлы генерируются PHP. В URL-адресах нет .php, поскольку они были предварительно заданы.

Любая идея, почему nginx может не возвращать 304 при повторных посещениях кешированного вывода PHP?

Чтобы уточнить: он использует proxy_cache для кеширования динамических страниц PHP (а не статических страниц html, созданных PHP). Я устанавливаю заголовки expires в PHP-файле на время + 24 часа. Имея это в виду, я надеялся, что nginx сможет затем вернуть 304 с на своих кэшированных версиях в течение этого 24-часового окна.

Пощупав разные вещи, выяснилось, что я пренебрегал объявлением заголовка «Последнее изменение» в php. Поскольку страница меняется ежедневно, я установил дату последнего изменения на предыдущую полночь. Теперь он возвращает 304 секунды, как и ожидалось.

Если бэкэнд php возвращает заголовок cookie с запросом, запрос считается новым. Попробуйте добавить эту директиву в расположение nginx с помощью proxy_pass:

proxy_ignore_headers "Cache-Control" "Expires" "X-Accel-Expires" "Set-Cookie";

Поскольку PHP генерирует файлы HTML на лету, они всегда новые (что касается Nginx).

Если вы хотите кэшировать PHP - вам необходимо использовать кеш операционного кода, например APC или xCache.