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

javascript url browser caching filenames

10008 просмотра

10 ответа

Обычно браузеры должны кэшировать ресурсы - JavaScript, CSS, изображения и т. Д. До тех пор, пока не появится новая версия, а затем убедиться, что браузер выбирает и кэширует новую версию.

Одним из решений является встраивание номера версии в имя файла ресурса, но будет ли размещение ресурсов, которыми нужно управлять таким образом, в каталоге с номером ревизии в нем, делать то же самое? Целый URL-адрес файла используется в качестве ключа в кэше браузера или это просто имя файла и некоторые метаданные?

Если мой код меняется с выборки /r20/example.jsна /r21/example.js, могу ли я быть уверен, что ревизия 20 из example.jsбыла кэширована, но теперь вместо нее ревизия 21 была выбрана и теперь она кэшируется?

Автор: Richard Turner Источник Размещён: 17.05.2019 02:38

Ответы (10)


35 плюса

Решение

Да, любое изменение в любой части URL (за исключением изменений протоколов HTTP и HTTPS) интерпретируется браузером (и любыми промежуточными прокси-серверами) как другой ресурс и, таким образом, приводит к отдельной сущности в кэше браузера.

Обновить:

Заявление в этой статье ThinkVitamin о том, что браузеры Opera и Safari / Webkit не кэшируют URL-адреса с? Query = strings, является ложным .

Добавление параметра номера версии к URL-адресу является вполне приемлемым способом очистки кеша.

Что может сбить с толку автора статьи ThinkVitamin, так это то, что нажатие клавиши Enter в строке адреса / адреса в Safari и Opera приводит к различному поведению URL-адресов со строкой запроса в них.

Однако ( и это важная часть! ) Opera и Safari ведут себя так же, как IE и Firefox, когда дело доходит до кэширования встроенных / связанных изображений, таблиц стилей и сценариев на веб-страницах - независимо от того, есть ли у них "?" символы в их URL. (Это можно проверить с помощью простого теста на обычном сервере Apache.)

(Я бы прокомментировал принятый в настоящее время ответ, если бы у меня была репутация, чтобы это сделать. :-)

Автор: Már Örlygsson Размещён: 17.09.2008 05:02

2 плюса

Я на 99,9999% уверен, что весь URL-адрес используется для кэширования ресурсов в браузере, поэтому схема URL-адреса должна работать нормально.

Автор: delux247 Размещён: 17.09.2008 02:46

2 плюса

Кеш-ключ браузера является комбинацией метода запроса и URI ресурса. URI состоит из схемы, полномочий, пути, запроса и фрагмента.

Соответствующая выдержка из спецификации HTTP 1.1 :

Основной ключ кеша состоит из метода запроса и целевого URI. Тем не менее, поскольку широко используемые сегодня кэши HTTP обычно ограничиваются кэшированием ответов на GET, многие кэши просто отклоняют другие методы и используют только URI в качестве основного ключа кэша.

Соответствующая выдержка из спецификации URI :

Общий синтаксис URI состоит из иерархической последовательности компонентов, называемой схемой, полномочиями, путем, запросом и фрагментом.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

hier-part   = "//" authority path-abempty
              / path-absolute
              / path-rootless
              / path-empty
Автор: Leonid Vasilev Размещён: 18.01.2017 09:55

1 плюс

МИНИМАЛЬНОЕ, что вам нужно для идентификации объекта HTTP - это полный путь, включая любые параметры строки запроса. Некоторые браузеры могут не кэшировать объекты строкой запроса, но это не имеет ничего общего с ключом кеша.

Также важно помнить, что путь больше не является достаточным. Заголовок Vary: в ответе HTTP предупреждает браузер (или прокси-сервер и т. Д.) О ДРУГОМ, чем URL-адрес, который следует использовать для определения ключа кэша, например о файлах cookie, значениях кодировки и т. Д.

На ваш основной вопрос, да, достаточно изменить URL-адрес файла .js. К большему вопросу о том, что определяет ключ кэша, это URL плюс ограничения заголовка Vary :.

Автор: Michael Cramer Размещён: 17.09.2008 03:40

0 плюса

Да. Другой путь одинаков с точки зрения кэшей.

Автор: noah Размещён: 17.09.2008 02:46

0 плюса

Конечно, он должен использовать весь путь '/r20/example.js' vs '/r21/example.js', для начала это могут быть совершенно разные изображения. То, что вы предлагаете, является жизнеспособным способом управления версиями.

Автор: Diodeus - James MacFarlane Размещён: 17.09.2008 02:47

0 плюса

В большинстве браузеров используется полный URL. В некоторых браузерах, если у вас есть запрос в URL, документ никогда не будет кэшироваться.

Автор: Alexandre Victoor Размещён: 17.09.2008 02:52

0 плюса

Весь URL. Я видел странное поведение в нескольких старых браузерах, где чувствительность к регистру вступала в игру.

Автор: user16169 Размещён: 17.09.2008 04:38

0 плюса

В дополнение к существующим ответам я просто хочу добавить, что это может не применяться, если вы используете ServiceWorkers или, например, offline-плагин. Тогда вы могли бы испытать различные правила кэширования в зависимости от того, как настроены ServiceWorkers.

Автор: activist Размещён: 24.10.2018 12:55

-1 плюса

зависит. Предполагается, что это полный URL, но некоторые браузеры (Opera, Safari 2 ) применяют другую стратегию кэширования для 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

Автор: scunliffe Размещён: 17.09.2008 02:46
Вопросы из категории :
32x32