2

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

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

在 Tools > Http Headers > Edit Http Header 下,我将 Cache-Control 的值设置为:public,max-age=604800

但是,这似乎没有任何效果(根据 Fiddler 和 Page Speed)。

任何有关为 Azure CDN 设置 Cache-Control 标头的提示将不胜感激。

4

1 回答 1

1

我自己也遇到了这个问题,需要更新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 的路径。还有 2 种可能的实现$blobClient;我从网上源重新利用了其中的一些代码,而未注释的代码对我有用。

我在这里看到的和你在网上看到的主要区别在于包含$blob.FetchAttributes(). 在不显式调用此方法的情况下,大多数 blob 属性(如Content-TypeLast Modified Date 和其他属性)将作为空/默认值加载到内存中,然后当$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 以进行验证。

于 2017-06-07T11:46:28.177 回答