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

У нас есть Flash-приложение, которое использует множество различных SWF-файлов, а также множество HTML, Javascript, PHP, XML и графических файлов. Сервер работает под управлением NGINX 1.13.3. (У нас есть замена HTML5/JS в разработке, я думаю, что проблемы здесь относятся также и к ней.)

Организация файлов под нашим webroot выглядит так:

/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 в любом месте.

Итак, теперь мы хотим выпустить v49 приложения. Мы создаем /client/client_v49 каталог, разверните все файлы в этом каталоге и измените символическую ссылку. Но во многих браузерах все еще хранятся старые версии файлов. Кешбастер при перенаправлении гарантирует, что они получат последнюю версию app.php, но на всех других URL-адресах, используемых в приложении, нет кешбастера. Все URL-адреса /client/current_client/...они не меняются от одной версии к другой.

Как мы можем гарантировать, что когда мы выпускаем новую версию, клиенты выбирают последнюю версию всего. Мы можем отправить Cache-Control заголовки, но это не кажется достаточно хорошим. Срок действия разных файлов в кеше может истечь в разное время, поэтому клиенты могут получить смесь файлов из разных версий.

В прошлом мы решали это, помещая клиента в iframe. client.php содержал что-то вроде:

<iframe src="client_v48/app.php"><iframe>

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

Вот когда мы перешли на использование перенаправления через current_client Симлинк, и столкнулся с проблемой кеширования.

С тех пор мы занимаемся тем, что даем другое имя current_client символическая. Поэтому, когда мы выпускаем v49, мы создаем новую ссылку:

/client/curclient => client_v49

и изменить client.php перенаправить на curclient/app.php, Это кажется очень нечистым, должен быть лучший путь. Кроме того, более 4 месяцев с момента нашего последнего обновления мы все еще видим небольшое количество обращений к предыдущей символической ссылке, что позволяет предположить, что некоторые пользователи добавили ее в закладки, так что даже это не идеальное решение.

Как другие сайты обеспечивают синхронизацию всех кэшированных файлов при развертывании новых версий? Должны ли мы просто отправить очень короткий Max-Age для всего, чтобы окно было очень маленьким?

1 ответ

Прошло много времени, но что-то вроде этого должно работать.

location ~ \.(swf)$ {
    expires -1;
}
Другие вопросы по тегам