Рейтинг:0

Кэширование Apache отключено, когда клиент отправляет заголовок If-Modified-Since

флаг li

Я пытаюсь заставить Apache кэшировать результаты запуска дорогого PHP-скрипта (он обращается к стороннему серверу с ограничением скорости), но кажется, что если клиент отправляет Если-Изменено-С заголовок обходит кеш.

CacheEnable диск /script.php
CacheLock включен
CacheLockMaxAge 60
CacheIgnoreHeaders Set-Cookie
# предотвратить явный запрос клиентом некэшированного контента
CacheIgnoreCacheControl включен
CacheDetailHeader включен

PHP-скрипт устанавливает в своем ответе следующие заголовки:

  • Последнее изменение установить текущее время, т.е. вс, 20 июня 2021 г., 11:30:20 по Гринвичу
  • Истекает установить текущее время плюс 60 секунд, например. вс, 20 июня 2021 г., 11:31:20 по Гринвичу

Если я выдам следующий запрос:

ПОЛУЧИТЬ /script.php HTTP/1.1
Хост: example.com
Подключение: закрыть

Тогда кеширование работает корректно, и php-скрипт запускается только раз в минуту, а остальные запросы обслуживаются из кеша.

Однако выдача следующего запроса:

ПОЛУЧИТЬ /script.php HTTP/1.1
Хост: example.com
Подключение: закрыть
If-Modified-Since: воскресенье, 20 июня 2021 г., 11:30:30 по Гринвичу

Запускает php-скрипт каждый раз с помощью:

X-Cache-Detail: «промах кеша: попытка сохранения объекта» с сайта example.com

в ответ.

Я использую Apache 2.4.29 на Ubuntu 18.04.

флаг no
Можете ли вы попробовать установить два заголовка? `"CacheIgnoreNoLastMod On" и `"CacheIgnoreHeaders If-Modified-Since"`
флаг li
@SreerajKarichery никаких изменений после установки этих настроек в mod_cache
djdomi avatar
флаг za
может быть шанс использовать ` Заголовок удален Last-Modified Заголовок не установлен, если-Modified-Since ` или аналогичный
флаг li
@djdomi нет, без изменений. Я думаю, что уже пробовал это, я не уверен, что заголовки удаляются до того, как их увидит mod_cache
djdomi avatar
флаг za
вот почему вы должны попытаться удалить его :)
djdomi avatar
флаг za
Кстати, я нашел, может быть, какой-то интересный момент для вас: https://stackoverflow.com/questions/10847157/handling-if-modified-since-header-in-a-php-script
Рейтинг:0
флаг za

Руководство по Mod-Cache с сайта Apache.org

https://httpd.apache.org/docs/2.4/mod/mod_cache.html

Использование пользовательских журналов для выявления проблемы

CustomLog "cached-requests.log" общий env=cache-hit
CustomLog "uncached-requests.log" общий env=cache-miss
CustomLog "revalidated-requests.log" общий env=cache-revalidate
CustomLog "invalidated-requests.log" общий env=cache-invalidate

Включить заголовок X-Cache-Detail

CacheDetailHeader включен

Установить игнорирование строк управления кэшем запросов

CacheIgnoreCacheControl On
CacheIgnoreQueryString на

Использование токена сеанса, такого как url.com/my.php?jsessionid=123, не должно кэшироваться или даже отдельно

CacheIgnoreURLSessionIdentifiers jsessenionid

Используйте МИНИМАЛЬНЫЙ измененный коэффициент, чтобы некэшированный запрос был доставлен 0,0 = 0% или 1,0 = 100%

CacheLastModifiedFactor 0,99

Установите минимальное время для действительного кэширования (по умолчанию 0)

CacheMinExpire 3600

Удалите заголовок if-Modfied, прежде чем он примет меры

Заголовок удален Last-Modified 
* Также можно использовать в htaccess

Сначала это больше для отладки, так как это не подходит для комментария, но должно помочь Inc повысить кэширование любого объекта.

флаг li
`CacheDetailHeader` уже включен. `CacheIgnoreCacheControl` уже включен. Использование CacheIgnoreQueryString нежелательно, так как строка запроса изменяет возвращаемый результат. `CacheIgnoreURLSessionIdentifiers` ничего не изменит, поскольку в URL-адресе нет идентификатора сеанса. `CacheLastModifiedFactor` и `CacheMinExpire` применяются, только если `Expires` не указан. `Header unset`, похоже, не влияет на поведение `mod_cache`
djdomi avatar
флаг za
Есть второй способ, но он делает его немного более запутанным, используйте Nginx перед Apache, у него больше контроля над кэшированием.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.