Назад | Перейти на главную страницу

Как обеспечить получение клиентами всех файлов после развертывания новой версии приложения Flash

У нас есть приложение на основе 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;
}