在Azure CDN上启用缓存

时间:2014-04-08 04:17:58

标签: azure azure-storage cache-control azure-cdn

我正在设置Azure CDN,但无法设置Cache-Control标头。

我使用Cloudberry Explorer在我的服务器文件夹和CDN之间设置同步。这很好用。我的所有文件都没有问题地复制到CDN。

在工具>下Http Headers>编辑Http Header我将Cache-Control的值设置为:public,max-age = 604800

然而,这似乎没有任何影响(根据Fiddler和Page Speed)。

任何有关为Azure CDN设置Cache-Control标头的提示都将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

我自己有这个问题,需要更新数千个文件的Cache-Control标题。为了防止站点中的缓存问题,我将每个版本的这些文件重新部署到新路径。

我能够在线修补一些不同的建议,并最终落实到以下解决方案,我目前用它来部署我的一个生产应用程序。

您需要两个文件,并且该脚本假定它们位于您计算机上的同一目录中:

  • 包含容器中文件列表的文本文件(请参阅下面的示例)
  • PowerShell脚本

文本文件(file-list.txt)

该文件应采用以下示例格式,并将完整文件路径部署到CDN容器。请注意,这使用正斜杠,并且不应包含容器名称,因为它将包含在脚本中。此文本文件的名称将包含在下面的PowerShell脚本中。

v12/app/app.js
v12/app/app.min.js
v12/app/app.min.js.map
v12/app/account/signup.js
v12/app/account/signup.min.js
... (and so on)

脚本(cdn-cache-control.ps1)

完整的脚本如下。您需要替换STORAGE_ACCOUNT_NAMESTORAGE_KEY等常量,如果您的版本不同,则可能需要更新Azure SDK DLL的路径。 $blobClient还有两种可能的实现方式;我在网上对一些来源的代码进行了重新调整,未经评论的代码对我有用。

我在这里和你在网上找到的内容之间的关键区别在于$blob.FetchAttributes()。在没有显式调用此方法的情况下,大多数blob属性(如Content-Type,上次修改日期等)将作为空/默认值加载到内存中,然后当调用$blob.SetProperties()时,这些空值将会被吹远离CDN中的现有文件,导致文件加载时没有Content-Type等。

Add-Type -Path "C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\Microsoft.WindowsAzure.StorageClient.dll"

$accountName = "STORAGE_ACCOUNT_NAME"
$accountKey = "STORAGE_KEY"
$blobContainerName = "STORAGE_CONTAINER_NAME"

$storageCredentials = New-Object Microsoft.WindowsAzure.StorageCredentialsAccountAndKey -ArgumentList $accountName,$accountKey
$storageAccount = New-Object Microsoft.WindowsAzure.CloudStorageAccount -ArgumentList $storageCredentials,$true
#$blobClient = $storageAccount.CreateCloudBlobClient()
$blobClient = [Microsoft.WindowsAzure.StorageClient.CloudStorageAccountStorageClientExtensions]::CreateCloudBlobClient($storageAccount)

$cacheControlValue = "max-age=31556926"

echo "Setting cache control: $cacheControlValue"

Get-Content "file-list.txt" | foreach {
    $blobName = "$blobContainerName/$_".Trim()
    $blob = $blobClient.GetBlobReference($blobName)
    $blob.FetchAttributes() 
    $blob.Properties.CacheControl = $cacheControlValue
    $blob.SetProperties()
    echo $blobName
}

查找有关批量设置Cache-Control标题的信息很棘手但我已经为多个生产版本运行此脚本并取得了巨大成功。我也验证了标题的配置,并定期针对我的网站运行Google的PageSpeed Insights进行验证。