Срок действия HTTP-кеша
Дата обновления перевода 2023-09-19
Срок действия HTTP-кеша
Модель срока действия - наиболее действенная и прямолинейная из двух кеширующих моделей, и должна быть использована во всех возможных случаях. Когда ответ кешируется со сроком окончания действия, кеш возвращает его напрямую, не обращаясь к приложению до того, как истечёт действие кешированного ответа.
Модель окончания действия можно создать используя один из двух практически
идентичных HTTP-заголовков: Expires
или Cache-Control
.
Дата обновления перевода 2023-01-16
Окончание действия с заголовком 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
определена.