Варьирование ответа для HTTP-кеша

Дата обновления перевода 2023-09-19

Варьирование ответа для HTTP-кеша

До этих пор предполагалось, что каждый URI имеет только одно представление целевого ресурса. По умолчанию, HTTP-кешрование происходит с исползованием URI ресурса в качестве ключа кеша. Если двое людей заправшивают один и тот же URI кешируемого ресурса, то второй человек получит кешированную версию.

Иногда этого недостаточно, и необходимо кешировать разные версии одного и того же URI, основываясь на одном или более значении заголовка запроса. Например, если вы сжимаете страницы, если клиент это поддерживает, любой URI имеет два представления: одно, если клиент поддерживает сжатие, а второе - если нет. Это определение проводится значением заголовка запроса Accept-Encoding.

В этом случае, вам нужно кешировать и хранить и сжатую и несжатую версиюответа для конкретного URI и возвращать их, в зависимости от значения запроса Accept-Encoding. Это делается с использованием заголовка ответа Vary, который представляет собой список различных заголовков, разделённых запятыми, значения которых вызывают разные представления запрошенного ресурса:

1
Vary: Accept-Encoding, User-Agent

Tip

Этот конкретный заголовок Vary будет кешировать разные версии каждого ресурса, основываясь на URI и значении загловков запроса Accept-Encoding и User-Agent.

Установите заголовок Vary через методы объекта Response или атрибут #[Cache()]:

1
2
3
4
5
6
7
8
9
10
11
// этот атрибут берёт массив с именем(ами) заголовка(ов)
// имена, для которых ответ варьируется
use Symfony\Component\HttpKernel\Attribute\Cache;
// ...

#[Cache(vary: ['Accept-Encoding'])]
#[Cache(vary: ['Accept-Encoding', 'User-Agent'])]
public function index(): Response
{
    // ...
}