Это имя файла или весь URL, используемый в качестве ключа в кеше браузера? - PullRequest
18 голосов
/ 17 сентября 2008

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

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

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

Ответы [ 10 ]

36 голосов
/ 17 сентября 2008

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

Обновление:

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

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

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

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

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

3 голосов
/ 18 января 2017

Ключ кеша браузера представляет собой комбинацию метода запроса и 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
2 голосов
/ 17 сентября 2008

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

1 голос
/ 17 сентября 2008

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

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

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

0 голосов
/ 24 октября 2018

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

зависит. предполагается, что это полный 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...