在Azure CDN上启用缓存
我正在设置Azure CDN,设置缓存控制标头时遇到问题 我使用Cloudberry Explorer在我的服务器文件夹和CDN之间设置同步。这很有效。我所有的文件都被复制到CDN,没有问题 在工具>Http头>编辑Http头下,我将缓存控制的值设置为:public,max age=604800 然而,这似乎没有任何影响(根据小提琴手和页面速度)在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设置缓存控制头的提示都将不胜感激。我自己也有这个问题,需要更新数千个文件的
缓存控制头。为了防止站点中出现缓存问题,我在每次发布时都将这些文件重新部署到一个新路径
我在网上拼凑了一些不同的建议,最终找到了下面的解决方案,我现在用它来部署我的一个生产应用程序
您需要两个文件,脚本假定它们位于计算机上的同一目录中:
- 包含容器中文件列表的文本文件(参见下面的示例)
- 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我猜是几百,也许是几千(大部分是很难说的第三方脚本)。不知道用这么多的脚本推荐什么:/