Заголовки: No-Vary-Search
Заголовок No-Vary-Search
Экспериментальная технология: Это экспериментальная технология
Перед использованием в production внимательно ознакомьтесь с таблицей совместимости браузеров.
HTTP-заголовок No-Vary-Search ответа задаёт набор правил, определяющих, как параметры запроса URL влияют на сопоставление с кэшем. Эти правила определяют, должны ли одинаковые URL с разными параметрами сохраняться в кэше браузера как отдельные записи.
Это позволяет браузеру повторно использовать существующие ресурсы, несмотря на различия в параметрах URL, и избегать затрат на повторную загрузку ресурса, если будет возвращено то же содержимое.
| Тип заголовка | Заголовок ответа |
|---|
Синтаксис
No-Vary-Search: key-order
No-Vary-Search: params
No-Vary-Search: params=("param1" "param2")
No-Vary-Search: params, except=("param1" "param2")
No-Vary-Search: key-order, params, except=("param1")
Директивы
key-orderНеобязательная-
Указывает, что URL не будут кэшироваться как отдельные записи, если различается только порядок параметров в URL. Наличие других параметров приведёт к раздельному кэшированию URL.
paramsНеобязательная-
Принимает логическое значение или список строк:
- Логическое значение (
params) указывает, что URL, различающиеся только параметрами, не будут кэшироваться как отдельные записи. - Внутренний список строк, разделённых пробелами (
params=("param1" "param2")). Указывает, что URL, различающиеся только перечисленными параметрами, не будут кэшироваться как отдельные записи. Наличие других параметров приведёт к их раздельному кэшированию.
- Логическое значение (
exceptНеобязательная-
Внутренний список строк, разделённых пробелами (
except=("param1" "param2")). Указывает, что URL, различающиеся только перечисленными параметрами, будут кэшироваться как отдельные записи. Для применения этой директивы необходимо включить логическую директивуparams(params, except=("param1" "param2")). Наличие других параметров, не входящих в списокexcept=, не приведёт к раздельному кэшированию URL.
Описание
>Связь с API правил спекулятивной загрузки
API правил спекулятивной загрузки поддерживает использование заголовка No-Vary-Search для повторного использования уже предварительно загруженной или предварительно отрисованной страницы с другими параметрами URL — если они перечислены в заголовке No-Vary-Search.
Предупреждение: При использовании предварительной отрисовки с No-Vary-Search требуется особая осторожность, поскольку страница изначально может быть предварительно отрисована с другими параметрами URL. No-Vary-Search используется для параметров URL, при которых сервер возвращает один и тот же ресурс, но клиент использует их для разных целей (отрисовка на стороне клиента, параметры UTM для аналитики и т. д.). Поскольку предварительная отрисовка может выполняться с другими параметрами URL, любой зависящий от них код должен запускаться только после активации предварительной отрисовки.
API правил спекулятивной загрузки также может включать поле expects_no_vary_search, указывающее браузеру ожидаемое значение No-Vary-Search (если оно есть) для документов, для которых через правила спекулятивной загрузки отправляются запросы на предварительную загрузку или предварительную отрисовку. Браузер может использовать это значение, чтобы заранее определить, целесообразнее ли дождаться завершения уже выполняющейся предварительной загрузки или отрисовки либо начать новый запрос при совпадении с правилом спекулятивной загрузки. Объяснение приведено в примере «expects_no_vary_search».
Примеры
>Разрешение сопоставлять ответы для URL с параметрами в разном порядке с одной записью кэша
Например, если у вас есть страница поиска, которая хранит критерии поиска в параметрах URL, и вы не можете гарантировать, что параметры будут добавляться в URL каждый раз в одном и том же порядке, можно разрешить сопоставлять ответы для URL, отличающихся только порядком параметров, с одной записью кэша с помощью key-order:
No-Vary-Search: key-order
Если добавить этот заголовок к соответствующим ответам, при поиске в кэше следующие URL будут считаться эквивалентными:
https://search.example.com?a=1&b=2&c=3 https://search.example.com?b=2&a=1&c=3
Однако наличие разных параметров URL приведёт к раздельному кэшированию этих URL. Например:
https://search.example.com?a=1&b=2&c=3 https://search.example.com?b=2&a=1&c=3&d=4
В приведённых ниже примерах показано, как управлять параметрами, игнорируемыми при сопоставлении с кэшем.
Разрешение сопоставлять ответы для URL с разными параметрами с одной записью кэша
Представим, что главная страница каталога пользователей, /users, уже сохранена в кэше. Параметр id может использоваться для отображения информации о конкретном пользователе, например /users?id=345. Следует ли считать этот URL идентичным для целей сопоставления с кэшем, зависит от поведения приложения:
- Если этот параметр приводит к загрузке совершенно новой страницы с информацией об указанном пользователе, ответ для этого URL следует кэшировать отдельно.
- Если этот параметр выделяет указанного пользователя на той же странице и, возможно, открывает выдвижную панель с его данными, браузеру лучше использовать кэшированный ответ для
/users. Это может повысить производительность при загрузке страниц пользователей.
Если ваше приложение работает так, как описано во втором примере выше, можно указать заголовок No-Vary-Search, чтобы /users и /users?id=345 считались идентичными для целей кэширования:
No-Vary-Search: params=("id")
Примечание: Если параметр исключён из ключа кэша с помощью params, то при его наличии в URL он будет игнорироваться при сопоставлении с кэшем независимо от его положения в списке параметров.
Разрешение сопоставлять ответы для URL с несколькими разными параметрами с одной записью кэша
Предположим, что в URL также есть параметры, задающие сортировку списка пользователей на странице по алфавиту в прямом или обратном порядке, а также язык отображения строк интерфейса, например /users?id=345&order=asc&lang=fr.
Чтобы браузер игнорировал все эти параметры при сопоставлении с кэшем, можно указать следующее:
No-Vary-Search: params=("id" "order" "lang")
Примечание: Поскольку это структурированное поле, параметры должны быть строками в кавычках, разделёнными пробелами, как показано выше, а не запятыми, к которым разработчики могут быть более привычны.
Если нужно, чтобы браузер игнорировал все эти параметры и любые другие, которые могут присутствовать при сопоставлении с кэшем, используйте логическую форму params:
No-Vary-Search: params
Указание параметров, которые приводят к несовпадению при сопоставлении с кэшем
Предположим, что приложение работает иначе: /users указывает на главную страницу каталога пользователей, а /users?id=345 — на отдельную страницу с подробной информацией о конкретном пользователе. В этом случае для целей сопоставления с кэшем нужно, чтобы браузер игнорировал все упомянутые выше параметры, кроме id. При его наличии браузер не будет сопоставлять запрос с записью кэша /users и запросит /users?id=345 с сервера.
Это можно реализовать следующим образом:
No-Vary-Search: params, except=("id")
Спецификации
Совместимость с браузерами
| Для настольных компьютеров | Для мобильных устройств | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
No-Vary-Search |
141121–141["До Chrome 127 правила спекулятивной загрузки поддерживались только для предварительной загрузки при навигации, но не для предварительной отрисовки.", "До Chrome 141 поддержка HTTP-кэша отсутствовала."] |
141121–141["До Edge 127 правила спекулятивной загрузки поддерживались только для предварительной загрузки при навигации, но не для предварительной отрисовки.", "До Edge 141 поддержка HTTP-кэша отсутствовала."] |
Нет |
125107–125["До Opera 113 правила спекулятивной загрузки поддерживались только для предварительной загрузки при навигации, но не для предварительной отрисовки.", "До Opera 125 поддержка HTTP-кэша отсутствовала."] |
Нет |
143121–143["До Chrome 127 правила спекулятивной загрузки поддерживались только для предварительной загрузки при навигации, но не для предварительной отрисовки.", "До Chrome 143 поддержка HTTP-кэша отсутствовала."] |
Нет |
9481–94["До Chrome 127 правила спекулятивной загрузки поддерживались только для предварительной загрузки при навигации, но не для предварительной отрисовки.", "До Chrome 143 поддержка HTTP-кэша отсутствовала."] |
Нет | 25.0["До Chrome 127 правила спекулятивной загрузки поддерживались только для предварительной загрузки при навигации, но не для предварительной отрисовки.", "До Chrome 143 поддержка HTTP-кэша отсутствовала."] |
121Поддерживается только для предварительной загрузки при навигации, но не для предварительной отрисовки и HTTP-кэша. |
Нет |
http_cache |
141 | 141 | Нет | 125 | Нет | 143 | Нет | 94 | Нет | Нет | Нет | Нет |
speculation_rules_prefetch |
121 | 121 | Нет | 107 | Нет | 121 | Нет | 81 | Нет | 25.0 | 121 | Нет |
speculation_rules_prerender |
127 | 127 | Нет | 113 | Нет | 127 | Нет | 84 | Нет | 28.0 | 135Можно включить с помощью Java API, а не Web API. См. https://goo.gle/android-prerender |
Нет |
См. также
-
Кэширование HTTP: Vary и заголовок
Vary
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/No-Vary-Search