在Azure CDN上启用缓存

在Azure CDN上启用缓存,azure,azure-storage,cache-control,azure-cdn,Azure,Azure Storage,Cache Control,Azure Cdn,我正在设置Azure CDN,设置缓存控制标头时遇到问题 我使用Cloudberry Explorer在我的服务器文件夹和CDN之间设置同步。这很有效。我所有的文件都被复制到CDN,没有问题 在工具>Http头>编辑Http头下,我将缓存控制的值设置为:public,max age=604800 然而,这似乎没有任何影响(根据小提琴手和页面速度) 任何关于为Azure CDN设置缓存控制头的提示都将不胜感激。我自己也有这个问题,需要更新数千个文件的缓存控制头。为了防止站点中出现缓存问题,我在每次

我正在设置Azure CDN,设置缓存控制标头时遇到问题

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

在工具>Http头>编辑Http头下,我将缓存控制的值设置为:public,max age=604800

然而,这似乎没有任何影响(根据小提琴手和页面速度)


任何关于为Azure CDN设置缓存控制头的提示都将不胜感激。

我自己也有这个问题,需要更新数千个文件的
缓存控制头。为了防止站点中出现缓存问题,我在每次发布时都将这些文件重新部署到一个新路径

我在网上拼凑了一些不同的建议,最终找到了下面的解决方案,我现在用它来部署我的一个生产应用程序

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

  • 包含容器中文件列表的文本文件(参见下面的示例)
  • 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\u ACCOUNT\u NAME
STORAGE\u KEY
,如果您有不同的版本,您可能需要更新Azure SDK DLL的路径。
$blobClient
还有两种可能的实现方式;我从网上的一个源代码中重新调整了一些代码的用途,而联合国评论的一个代码对我很有用

我这里的内容与您在网上看到的内容之间的关键区别在于包含了
$blob.FetchAttributes()
。在不显式调用此方法的情况下,大多数blob属性(如
内容类型
、上次修改日期等)将作为空/默认值加载到内存中,然后在调用
$blob.SetProperties()
时,这些空值将清除CDN中的现有值,导致加载文件时没有
内容类型

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
}

要找到有关批量设置
缓存控制
头的信息是很困难的,但我已经在多个生产版本中运行了此脚本,并取得了巨大成功。我也验证了标题的配置,并定期对我的站点运行Google的PageSpeed Insights进行验证。

您能检查blob上的
缓存控件
属性是否设置正确吗?您可以通过从Cerburata获取blob属性或其他第三方工具(如
Azure Explorer
)或从CodePlex获取
Azure Storage Explorer
)以编程方式进行验证。使用来自Cerburata的Azure Explorer,它似乎未被设置:-(这看起来像是Cloudberry Explorer的问题。我不认为该工具正在设置标题。您可能想寻求他们的支持或使用其他工具。基本上,必须设置blob上的cache control header属性。HTH。看起来它必须对每个文件发出HTTP请求。您运行此操作的文件有多少个?我已经完成了。)有几十万。@joshuacheck我猜是几百,也许是几千(大部分是很难说的第三方脚本)。不知道用这么多的脚本推荐什么:/