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

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

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

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


person Richard Turner    schedule 17.09.2008    source источник


Ответы (10)


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

Обновление:

Утверждение в этой статье ThinkVitamin, что браузеры Opera и Safari/Webkit не t кэшировать URL-адреса с ?query=strings false.

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

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

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

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

person Már Örlygsson    schedule 17.09.2008
comment
Мне нужно будет перепроверить текущие браузеры, но я могу подтвердить, что в прошлом изменение только параметров в URL-адресе НЕ гарантировало, что кеш будет поврежден. Имейте в виду, что мой ответ также был добавлен почти 3 года назад ... с тех пор многое изменилось. - person scunliffe; 20.03.2011
comment
Мой ответ выше также от 3 лет назад. Тогда я провел тщательный тест и с облегчением обнаружил, что Safari и Opera ведут себя разумно. Однако тестирование было трудным/запутанным, потому что Safari и Opera, как правило, игнорировали директивы кеша для связанных ресурсов при перезагрузке страниц (или нажатии Enter в адресной строке), а не при доступе к ним по ссылкам. - person Már Örlygsson; 20.03.2011
comment
Кстати, изменение только параметров в URL-адресе НЕ гарантировало, что кеш будет поврежден, - это странное утверждение. Я никогда не видел, чтобы кто-то предлагал это раньше. Только наоборот (как в ныне утерянной статье ThinkVitamin), что браузеры не кэшируют страницы с параметрами (что они все еще делают). - person Már Örlygsson; 20.03.2011
comment
Я добавил комментарий к своему исходному ответу выше. Хитрость в том, что существуют десятки браузеров (настольных и мобильных), прокси и программных приложений, которые используют веб-контент. Поскольку, по крайней мере, исторически было невозможно зависеть от очистки кеша через параметр URL, я уже давно использовал методы переименования файлов. - person scunliffe; 20.03.2011
comment
Я не могу себе представить, чтобы какой-либо кеш в истории браузеров, мозиллы, нетскейпа и т. д. игнорировал строку запроса при получении ключа для кеша. Вся цель строки запроса всегда заключалась в том, чтобы изменить ответ http, и его игнорирование сделало бы кеш бесполезным. - person chad steele; 29.08.2019

Ключ кэша браузера представляет собой комбинацию метода запроса и 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
person Leonid Vasilev    schedule 18.01.2017
comment
Наверняка часть #fragment никогда не используется в качестве ключа кэша. В любом случае его нет в HTTP-запросах. Это часть функциональности браузера, а не HTTP. - person Alexis Wilke; 27.03.2019

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

person delux247    schedule 17.09.2008
comment
Ну... кроме части #fragment. - person Alexis Wilke; 27.03.2019

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

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

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

person Michael Cramer    schedule 17.09.2008

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

person noah    schedule 17.09.2008

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

person Diodeus - James MacFarlane    schedule 17.09.2008

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

person scunliffe    schedule 17.09.2008
comment
Статья ThinkVitamin.com неверна. Safari и Opera делают кэширование URL-адресов со строками запроса точно так же, как и любые URL-адреса. (см. мой ответ для получения дополнительной информации) - person Már Örlygsson; 20.03.2011
comment
Помимо браузеров, некоторые популярные прокси-серверы требуют изменения имени файла, чтобы сломать кеш. stevesouders.com/blog/2008/08 /23/ В этой статье упоминается прокси-сервер Squid (который изменил значение по умолчанию в версии 2.7). Я бы предпочел перестраховаться и изменить имя файла. - person scunliffe; 20.03.2011
comment
Боюсь, вы либо неправильно читаете пост Стива Саундерса, либо неправильно его печатаете. Выводы Стива заключаются в том, что его прокси-сервер Squid не кэшировал URL-адрес строки запроса, что является полной противоположностью необходимости изменения имени файла для взлома кеша. - person Már Örlygsson; 20.03.2011
comment
Относительно заданного вопроса. Это имя файла или весь URL-адрес используется в качестве ключа в кешах браузера? тогда ответ простой Да. То, что некоторые (как правило, устаревшие промежуточные прокси-серверы) перестраховываются и не кэшируют некоторые типы URL-адресов, является незначительным раздражением и не меняет основного факта, что весь URL-адрес используется в качестве ключа во всех веб-сайтах. чачи. - person Már Örlygsson; 20.03.2011
comment
Просто для потомков: я считаю, что пользовательские агенты никогда не должны кэшировать URL-адреса со строками запроса отсутствует важная часть из RFC2616: поскольку некоторые приложения традиционно использовали GET и HEAD с URL-адресами запросов [...] для выполнения операций со значительными побочными эффектами, кэшированием НЕ ДОЛЖНЫ рассматривать ответы на такие URI как свежие, если только сервер не предоставляет явное время истечения срока действия (выделено мной). - person Arjan; 13.08.2014
comment
Можете ли вы указать на часть спецификации кэширования HTTP, в которой говорится об этом? - person Darrel Miller; 03.09.2014
comment
@DarrelMiller, ты спрашиваешь меня (@scunliffe) или @Arjan? - person scunliffe; 03.09.2014
comment
@scanliffe В своем ответе вы процитировали. Согласно письму спецификации кэширования HTTP, пользовательские агенты никогда не должны кэшировать URL-адреса со строками запроса. Я считаю, что это неверно. - person Darrel Miller; 03.09.2014

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

person user16169    schedule 17.09.2008

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

person activist    schedule 24.10.2018

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

person Alexandre Victoor    schedule 17.09.2008