Срок действия HTTP-кэша
Дата обновления перевода 2025-02-14
Срок действия HTTP-кэша
Модель срока действия - наиболее действенная и прямолинейная из двух кеширующих моделей, и должна быть использована во всех возможных случаях. Когда ответ кешируется со сроком окончания действия, кэш возвращает его напрямую, не обращаясь к приложению до того, как истечёт действие кешированного ответа.
Модель окончания действия можно создать используя один из двух практически
идентичных HTTP-заголовков: Expires или Cache-Control.
Дата обновления перевода 2025-02-14
Окончание действия с заголовком Cache-Control
В большинстве случаев вы будете использовать заголовок Cache-Control.
Вспомните, что заголовок Cache-Control используется для указания многих
разных директив кеша:
1 2 3 4 5 6 7 8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...
#[Cache(public: true, maxage: 600)]
public function index(): Response
{
// ...
}
Заголовок Cache-Control примет следующий формат (он может иметь
дополнительные директивы):
1
Cache-Control: public, s-maxage=600
Note
Использование метода setSharedMaxAge() не эквивалентно использованию
методов setPublic() и setMaxAge(). В соответствии с разделом
Выдача несвежих ответов в RFC 7234, настройка s-maxage (добавленная
методом setSharedMaxAge()) запрещает кешу использовать несвежий ответ в
сценариях stale-if-error. Поэтому рекомендуется использовать директивы
public и max-age.
Срок действия с заголовком Expires
Альтернативой заголовку Cache-Control является Expires. В них нет преимуществ
и недостатков: они просто представляют собой разные способы установки кеширования окончания
действия в вашем ответе.
По обозначению HTTP-спецификации, "Поле заголовка Expires предоставляет дату/время,
после которых ответ считается несвежим." Заголовок Expires может быть установлен
с помощью опции expires атрибута #[Cache()] или метода setExpires() Response:
1 2 3 4 5 6 7 8
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...
#[Cache(expires: '+600 seconds')]
public function index(): Response
{
// ...
}
В результате, HTTP-заголовок будет выглядеть так:
1
Expires: Thu, 01 Mar 2011 16:00:00 GMT
Note
Опция expires и метод setExpires() автоматически конвертируют дату в
часовой пояс GMT, как того требует спецификация.
Отметьте, что в версиях HTTP до 1.1, первоначальный сервер не был обязан отправлять
заголовок Date. Следовательно, кешу (например, браузеру) может быть необходимо
положиться на локальные часы, чтоб оценить заголовок Expires, что делает расчёт
жизненного цикла уязвимым к рассхинхронизации часов. Ещё одно ограничение заголовка
Expires заключается в том, что "Серверы HTTP/1.1 не должны отправлять даты
Expires далее, чем на один год в будущем."
Note
В соответствии с разделом Вычисления срока жизни свежести в RFC 7234,
значение заголовка Expires игнорируется, когда директива s-maxage
или max-age заголовка Cache-Control определена.