Azure Devops устанавливает максимальный возраст для index.html в хранилище Azure с помощью Azure CDN на статическом веб-сайте.

Итак, я не хочу, чтобы мой index.html в моем статическом приложении vue.js всегда кэшировался из-за обновлений. Я могу установить максимальный возраст в проводнике хранилища вручную. У меня есть Azure CDN, настроенный для этого сайта, который я очищаю после каждого развертывания, но я не думаю, что это всегда будет обновлять текущих пользователей, потому что max-age в index.html не установлен. Есть ли способ установить максимальный возраст из CDN? Или есть команда azure cli, которую я должен использовать при развертывании DevOps, чтобы установить максимальный возраст в файле index.html в хранилище. Я не вижу много документации по этому поводу, может быть, CDN просто обо всем позаботится?

1 ответ

Решение

Убедитесь, что вы установили правильные значения как для "кэширования на стороне сервера" CDN, так и для "локального кеширования" в браузере. Вам нужно установить Max-Age для большого двоичного объекта, чтобы он всегда был актуальным в CDN, при использованииCache-Controlзаголовок в Blob, чтобы браузер всегда читал текущую версию. Это также известно как "внутренний максимальный возраст" по сравнению с "внешним максимальным возрастом" (Cache-Control) в CDN, хотя наименование зависит от поставщика.

См. Также мой недавний ответ на этот вопрос: Как остановить кэширование index.html в Azure CDN

Для меня я обнаружил, что обычно достаточно установить Cache-Control заголовок в хранилище BLOB-объектов на index.htmlдля управления как серверным, так и локальным кешированием. По крайней мере, поставщик Azure CDN уважает это и на стороне сервера, поэтому вам нужно приложить минимум усилий.

См. Также этот пример кода, если вы хотите добавить его в свой конвейер: https://schwabencode.com/blog/2019/05/03/Update-Azure-Storage-Blob-Properties-with-PowerShell

# Storage Settings
$storageAccount = "__storage account__";
$containerName = "__container name__";

# Blob Update Settings
$contentCacheControl = "public, max-age=2592000"; # 30 days
$extensions = @(".gif", ".jpg", ".jpeg", ".ico", ".png", ".css", ".js");

# Read all blobs
$blobs = az storage blob list --account-name $storageAccount --container-name $containerName --num-results * --output json | ConvertFrom-Json

# iterate all blobs
foreach($blob in $blobs)
{
    # use name as identifier
    $blobName = $blob.name;

    # get extension
    $extension = [System.IO.Path]::GetExtension($blobName).ToLower();
 
    # update blob if extension is affected
    if($extensions.Contains($extension))
    {
        az storage blob update --account-name $storageAccount --container-name $containerName --name $blobName --content-cache-control $contentCacheControl
        Write-Host "Updated $blobName" 
    }
}
Другие вопросы по тегам