Как обеспечить, чтобы клиенты забирали все файлы после развертывания новой версии приложения 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;
}