首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Azure CDN上启用缓存

在Azure CDN上启用缓存
EN

Stack Overflow用户
提问于 2014-04-08 04:17:58
回答 1查看 1.6K关注 0票数 2

我正在设置Azure CDN,设置缓存控制头有问题.

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

在Tools > Http Header > Edit Http Header下,我将缓存控制的值设置为: public,max-age=604800。

然而,这似乎没有任何影响(根据Fiddler和页面速度)。

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

EN

回答 1

Stack Overflow用户

发布于 2017-06-07 11:46:28

我自己也有这个问题,需要更新数千个文件的Cache-Control头。为了防止站点中的缓存问题,我在每次发布后重新部署这些文件到一个新路径。

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

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

  • 一个文本文件,包含容器中文件的列表(参见下面的示例)
  • PowerShell脚本

文本文件(文件-list.txt)

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

代码语言:javascript
复制
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-缓存-Control.ps1)

完整的脚本如下。您需要替换常量,如STORAGE_ACCOUNT_NAMESTORAGE_KEY,如果您有不同的版本,则可能需要更新Azure的路径。还有两种可能的$blobClient实现;我从一个在线源代码中重新使用了其中的一些代码,而未注释的代码对我很有用。

我在这里拥有的内容与您在网上发现的内容之间的关键区别是包含了$blob.FetchAttributes()。在不显式调用此方法的情况下,大多数blob属性(如Content-Type、最后修改日期等)将以空/默认值的形式加载到内存中,然后当调用$blob.SetProperties()时,这些空值将吹走CDN中现有的值,导致在没有Content-Type的情况下加载文件。

代码语言:javascript
复制
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 Insight来验证。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22927440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档