У нас есть приложение на основе Flash, которое использует множество различных SWF-файлов, а также множество файлов HTML, Javascript, PHP, XML и изображений. На сервере работает NGINX 1.13.3. (У нас в разработке есть замена HTML5 / JS, я думаю, что проблемы здесь применимы и к ней.)
Файловая организация в нашем корневом каталоге выглядит так:
/client/client.php
/client/client_v48
app.php
MainLine.swf
other files and subdirectories
/client/current_client symlink to client_v48
В настоящее время все работает так:
client.php
отправляет перенаправление на current_client/app.php?cb=<randomstring>
. app.php
возвращает HTML-код главной страницы приложения, который включает <object>
тег, который загружает MainLine.swf
, а затем загружает все остальные необходимые ресурсы. Во всем приложении все использует относительные URL-адреса, мы не жестко кодируем v48
везде.
Итак, теперь мы хотим выпустить версию 49 приложения. Мы создаем /client/client_v49
каталог, разверните все файлы в этом каталоге и измените символическую ссылку. Но во многих браузерах все еще хранятся старые версии файлов в кеше. Cachebuster при перенаправлении гарантирует, что они получат последнюю версию app.php
, но для всех остальных URL-адресов, используемых в приложении, кешбастера нет. Все URL-адреса /client/current_client/...
, они не меняются от одной версии к другой.
Как мы можем гарантировать, что, когда мы выпускаем новую версию, клиенты выбирают последнюю версию всего. Мы можем отправить Cache-Control
заголовки, но этого, похоже, недостаточно. Срок действия разных файлов в кеше может истечь в разное время, поэтому клиенты могут получить несколько файлов из разных версий.
Раньше мы решали эту проблему, помещая клиента в iframe. client.php
содержал что-то вроде:
<iframe src="client_v48/app.php"><iframe>
Когда мы выпустили новую версию, мы изменили номер версии в источнике iframe. Пользователи не видели номер версии в местоположении браузера, поэтому они случайно не добавили его в закладки. Но некоторые из наших поставщиков рекламы не позволяют встраивать их в окна iframe, поэтому нам пришлось избавиться от этого.
Тогда мы перешли на использование перенаправления через current_client
символическая ссылка и столкнулась с проблемой кеширования.
С тех пор мы даем другое название current_client
символическая ссылка. Поэтому, когда мы выпускаем v49, мы создаем новую ссылку:
/client/curclient => client_v49
и изменить client.php
перенаправить на curclient/app.php
. Это кажется очень нечистым, должен быть способ получше. Кроме того, спустя более 4 месяцев с момента нашего последнего обновления, мы все еще видим небольшое количество обращений к предыдущей символической ссылке, предполагая, что некоторые пользователи добавили ее в закладки, так что даже это не идеальное решение.
Как другие сайты обеспечивают синхронизацию всех кэшированных файлов при развертывании новых версий? Мы просто отправим короткое Max-Age
для всего, чтобы окно было очень маленьким?
Прошло много времени, но что-то вроде этого должно работать.
location ~ \.(swf)$ {
expires -1;
}