Сбой кэша через параметры

Мы хотим, чтобы кеш-бюст на производственных развертываниях, но не тратил кучу времени с летучей мыши, выясняя систему для этого. Моя мысль заключалась в том, чтобы применить параметр к концу css и js-файлов с текущим номером версии:

 

Два вопроса: будет ли это эффективно разрушать кеш? Будет ли параметр заставлять браузер не кэшировать ответ с этого URL-адреса, поскольку параметр указывает, что это динамический контент?

Параметр ?v=1.123 указывает строку запроса, и поэтому браузер будет считать, что это новый путь от, скажем, ?v=1.0 . Таким образом, он загружается из файла, а не из кеша. Как пожелаете.

И браузер предположит, что при следующем вызове источник останется таким же ?v=1.123 и должен кэшировать его с помощью этой строки. Таким образом, он будет сохранен в кэше, однако ваш сервер настроен, пока вы не перейдете к ?v=1.124 или так далее.

Два вопроса: будет ли это эффективно разрушать кеш?

Да. Даже Stack Overflow использует этот метод, хотя я помню, что они (со своими миллионами посетителей в день и дваллионами разных клиентских и прокси-версий и конфигураций) имели некоторые крайние случаи, когда этого было недостаточно, чтобы разбить кеш. Но общее предположение заключается в том, что это будет работать и является подходящим методом для разрыва кэширования на клиентах.

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

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

Безопаснее поставить номер версии в фактическое имя файла. Это позволяет сразу создавать несколько версий, чтобы вы могли развернуть новую версию, и если все кэшированные HTML-страницы все еще существуют, которые запрашивают более старую версию, они получат версию, которая работает со своим HTML.

Обратите внимание, что в одном из самых больших версий развертывания в любом месте в Интернете jQuery использует номера версий в фактическом имени файла, и он безопасно позволяет нескольким версиям сосуществовать без какой-либо специальной серверной логики (каждая версия представляет собой просто другой файл).

Это разрушает кеш один раз, когда вы развертываете новые страницы и новые связанные файлы (которые вы хотите), и с тех пор эти версии могут быть эффективно кэшированы (что вам также нужно).

Он разобьет кеш один раз, после того, как клиент скачал ресурс, каждый другой ответ будет отправлен из кэша клиента, если только:

  1. параметр v обновляется.
  2. клиент очищает свой кеш

Как говорили другие, переполнение кэша с параметром запроса обычно считается плохой идеей ™ и длится долгое время. Лучше отразить версию в имени файла. Html5 Boilerplate рекомендует , помимо прочего, использовать строку запроса.

Тем не менее, из рекомендаций, которые я видел, которые цитировали источник, все, кажется, берут свою мудрость из статьи Стив Сьюдера от 2008 года. Его выводы основаны на поведении прокси в то время, и они могут или не могут быть актуальными в наши дни. Тем не менее, при отсутствии более текущей информации изменение имени файла является безопасным вариантом.

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

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

Это очень зависит от того, насколько вы надежны в своем кэшировании. Например, прокси-сервер squid (и, возможно, другие) по умолчанию не кэширует URL-адреса, обслуживаемые с помощью запроса, по крайней мере, это было, когда эта статья была написана. Если вы не возражаете против определенных случаев использования, которые вызывают ненужные промахи в кеше, переходите к параметрам запроса. Но очень просто настроить схему кэширования на основе имен файлов, которая позволяет избежать этой проблемы.

Здесь найдено сравнение двух методов (строка запроса с именем файла):

Версия в виде запроса имеет две проблемы.

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

Во-вторых, в некоторых более сложных сценариях развертывания, где у вас есть несколько интерфейсных и / или множественных серверных серверов, обновление происходит совсем не мгновенно. Вы должны одновременно использовать как старую, так и новую версию своих активов. См. Например, как это влияет на вас при использовании Google App Engine.

Другим аналогичным подходом является использование htaccess mod_rewrite для игнорирования части пути при обслуживании файлов. Ваша никогда не кэшированная индексная страница ссылается на последний путь к файлам.

С точки зрения развития это так же просто, как использование параметров для номера версии, но оно столь же устойчиво, как и имя файла.

Используйте проигнорированную часть пути для номера версии, и сервер просто игнорирует ее и обслуживает файл без файла.

1.2.3/css/styles.css тот же файл, что и css/styles.css поскольку первый каталог лишается и игнорируется файлом htaccess

Включая файлы версий

 < ?php $version = "1.2.3"; ?>              

Обратите внимание, что этот подход означает, что вам нужно отключить кеширование вашей индексной страницы – используя tags , чтобы отключить кеширование во всех браузерах?

.htaccess файл

 RewriteEngine On # if you're requesting a file that exists, do nothing RewriteCond %{REQUEST_FILENAME} !-f # likewise if a directory that exists, do nothing RewriteCond %{REQUEST_FILENAME} !-d # otherwise, rewrite foo/bar/baz to bar/baz - ignore the first directory RewriteRule ^[^/]+/(.+)$ $1 [L] 

Вы можете использовать тот же подход на любой серверной платформе, которая позволяет переписывать URL-адреса

(переписать условие, адаптированное из mod_rewrite – переписать каталог в строку запроса, кроме / #! / )

… и если вам нужна перегрузка кеша для вашей страницы указателя страницы / сайта, вы всегда можете использовать JavaSript для ее обновления.

  

Кэш-всплеск использует некоторое случайное число в конце URL-адреса, как указано ниже

  

и браузер создает что-то вроде этого,

 http://ad.doubleclick.net/ABC/publisher/zone;topic=abc;sbtpc=def;cat=ghi;kw=xyz;tile=1;slot=728x90.1;sz=728x90;ord=7268140825331981? 

Подробнее здесь .