Какую стратегию следует использовать для HTTP-сервера Apache, чтобы кэш-память недавно развернутых файлов была признана недействительной?

Очень распространенное решение заключается в следующем:

<ifModule mod_headers.c>
    FileETag None
    Header unset ETag
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires "Thu, 01 Jan 1970 00:00:01 GMT"
</ifModule>

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

Я в некоторой степени придерживаюсь того, что я читаю из этого ответа:

https://stackoverflow.com/questions/499966/etag-vs-header-expires

Это звучит правильно?

1 ответ

Решение

Etag - хорошая идея, но ваш заголовок expires нарушает его. Почему бы просто не установить заголовок expires на вменяемое значение? Слишком много людей устанавливают срок действия на сумасшедшие даты, что для правильно настроенного клиента заставит клиента даже не отправлять запрос на сервер.

Во-первых, установите истекает что-то вменяемое, как request date + 1 week (каким бы ни был ваш ожидаемый цикл выпуска). Затем клиенты, которые должным образом следуют спецификациям для заголовков expires, будут проверять через столько времени. Это намного проще и надежнее, чем пытаться кешировать все, что происходит при каждом развертывании.

РЕДАКТИРОВАТЬ: я предположил, что пример, который вы дали, был ваш конфиг. Я не хочу сказать, что это звучит грубо, но я вижу людей, которые все время делают глупости с кэшированием.

Другие вопросы по тегам