Это имя файла или весь URL-адрес, используемый в качестве ключа в кешах браузера?
-
01-07-2019 - |
Вопрос
Браузеры обычно кэшируют ресурсы — JavaScript, CSS, изображения и т. д.до тех пор, пока не станет доступна новая версия, а затем убедитесь, что браузер вместо этого извлекает и кэширует новую версию.
Одним из решений является встраивание номера версии в имя файла ресурса, но приведет ли размещение ресурсов, которыми нужно управлять таким образом, в каталоге с номером версии в нем, то же самое?Используется ли весь URL-адрес файла в качестве ключа в кеше браузера или это просто имя файла и некоторые метаданные?
Если мой код изменится с получения /r20/example.js
к /r21/example.js
, могу ли я быть уверен, что версия 20 example.js
был кэширован, но теперь вместо него была получена версия 21, и теперь она кэшируется?
Решение
Да, любые изменения в любая часть URL-адреса (исключая изменения протоколов HTTP и HTTPS) интерпретируется браузером (и любыми промежуточными прокси-серверами) как другой ресурс и, таким образом, приводит к созданию отдельного объекта в кеше браузера.
Обновлять:
Иск в эта статья ThinkVitamin что браузеры Opera и Safari/Webkit не кэшируют URL-адреса с помощью ?query=strings, ЛОЖЬ.
Добавление параметра номера версии в URL-адрес — вполне приемлемый способ очистки кеша.
Что, возможно, смутило автора статьи ThinkVitamin, так это тот факт, что нажатие Enter в строке адреса/расположения в Safari и Opera приводит к разному поведению URL-адресов со строкой запроса в них.
Однако, (и это важная часть!) Опера и Сафари вести себя так же, как IE и Firefox Когда дело доходит до кэширования встроенных/связанных изображений и таблиц стилей и сценариев на веб -страницах - независимо от того, есть ли у них "?" персонажи в своих URL.(Это можно проверить с помощью простого теста на обычном сервере Apache.)
(Я бы прокомментировал принятый в настоящее время ответ, если бы у меня была такая репутация.:-)
Другие советы
Ключ кэша браузера представляет собой комбинацию метода запроса и URI ресурса.URI состоит из схемы, полномочий, пути, запроса и фрагмента.
Соответствующая выдержка из Спецификация HTTP 1.1:
Первичный ключ кэша состоит из метода запроса и целевого URI.Однако, поскольку сегодня общее использование кэша HTTP обычно ограничиваются кэширующими реакциями, многие кэши просто отказываются от других методов и используют только URI в качестве основного ключа кэша.
Соответствующая выдержка из Спецификация URI:
Общий синтаксис URI состоит из иерархической последовательности компонентов, называемой схемой, авторитетом, пути, запросом и фрагментом.
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
Я на 99,99999% уверен, что для кэширования ресурсов в браузере используется весь URL-адрес, поэтому ваша схема URL-адресов должна работать нормально.
МИНИМУМ, который вам необходим для идентификации объекта HTTP, — это полный путь, включая любые параметры строки запроса.Некоторые браузеры могут не кэшировать объекты с помощью строки запроса, но это не имеет никакого отношения к ключу к кэшу.
Также важно помнить, что пути уже недостаточно.Вари:заголовок в ответе HTTP предупреждает браузер (или прокси-сервер и т. д.) обо всем, кроме URL-адреса, который должен использоваться для определения ключа кэша, например, о файлах cookie, значениях кодировки и т. д.
На ваш основной вопрос: да, достаточно изменить URL-адрес файла .js.К более широкому вопросу о том, что определяет ключ кэша, это URL-адрес плюс переменная:ограничения заголовка.
Да.Другой путь такой же с точки зрения кэшей.
Конечно, он должен использовать весь путь «/r20/example.js» и «/r21/example.js» могут быть совершенно разными изображениями для начала.То, что вы предлагаете, является жизнеспособным способом управления версиями.
В большинстве браузеров используется полный URL-адрес.В некоторых браузерах, если в URL-адресе есть запрос, документ никогда не будет кэшироваться.
Весь URL.Я видел странное поведение в нескольких старых браузерах, где учитывалась чувствительность к регистру.
В дополнение к существующим ответам я просто хочу добавить, что это может не применяться, если вы используете ServiceWorkers или, например, автономный плагин.Тогда вы можете столкнуться с разными правилами кэширования в зависимости от того, как настроены ServiceWorkers.
зависит от.предполагается, что это полный URL-адрес, но некоторые браузеры (Opera, Safari2) применить другую стратегию кэширования для URL-адресов с разными параметрами.
лучше всего изменить имя файла.
Здесь есть очень умное решение (использует PHP, Apache)
http://verens.com/archives/2008/04/09/javascript-cache-problem-solved/
Стратегия отмечает:«Согласно букве спецификации HTTP-кэширования, пользовательские агенты никогда не должны кэшировать URL-адреса со строками запросов.В то время как Internet Explorer и Firefox игнорируют это, Opera и Safari этого не делают — чтобы убедиться, что все пользовательские агенты могут кэшировать ваши ресурсы, нам нужно исключить строки запроса из их URL-адресов».
http://www.thinkvitamin.com/features/webapps/serving-javascript-fast