Это имя файла или весь URL-адрес, используемый в качестве ключа в кешах браузера?

StackOverflow https://stackoverflow.com/questions/83990

Вопрос

Браузеры обычно кэшируют ресурсы — 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top