Azure CDN清除不刷新缓存内容。

12
我有一个连接到Blob存储的Azure CDN(Verizon、高级版)。根据教程第6步,我有两条规则。这些规则旨在强制CDN在调用CDN的根目录时提供“index.html”。它们可能与问题相关或不相关,但在步骤6中描述如下:
  1. 确保下拉菜单显示为“IF”和“Always”
  2. 在“功能”旁边点击“+”按钮两次。
  3. 将这两个新建的下拉菜单设置为“URL重写”
  4. 将所有源和目标下拉菜单设置为您创建的终结点(以终结点名称为值)
  5. 对于第一个源模式,设置为((?:[^\?]/)?)($|\?.)
  6. 对于第一个目标模式,设置为 $1index.html$2
  7. 对于第二个源模式,设置为((?:[^\?]/)?[^\?/.]+)($|\?.)
  8. 对于第二个目标模式,设置为$1/index.html$2
我最初将文件上传到Blob存储,能够通过CDN访问它们(证明上述规则正确),然后更改本地文件(调试)以上传到Blob存储。在更新了Blob存储上的所有文件并手动清除“全部清除”选项的CDN终结点后,CDN向我提供旧文件,并在直接访问Blob存储时向我提供新文件。这似乎发生在每个文件上(即使直接访问文件,而不仅仅是index.html)。在等待约10小时、清除浏览器缓存并尝试从未使用过的浏览器访问CDN后,问题仍然存在。
有人知道可能正在发生什么吗?它是否被缓存在我的网络和CDN终结点之间?我感觉我可能错过了非常简单的东西...

编辑1:我有另一个连接到相同存储容器的Verizon(非高级)CDN,在清除缓存后它会获取正确的文件。然而,即使现在(24小时后),高级CDN仍未提供更新的文件。

编辑2:联系了Azure的Microsoft支持,他们花了约6个小时进行调查,但没有找到解决方法。最终我们尝试再次清除缓存,现在更新的文件已被发送。仍不确定问题所在。

4个回答

14

经过与Microsoft和Verizon Digital Media支持团队数周的合作后,他们终于找到了解决方案。

为避免干扰清除过程,最简单的方法是在规则的“特性”部分之前实施以下“IF”语句:

IF | 请求头通配符 | 名称 | 用户代理 | 不匹配 | 值 | ECPurge/* | 忽略大小写(已选中)

此if语句将跳过使用清除用户代理发出的请求的所有规则,使请求以正常方式命中CDN。


2
最好您能够编辑并发送屏幕截图,而不是这样。Azure CDN规则可能会用一些复杂的术语。 - Dean Christian Armada
对我来说不起作用... :\ 我要向微软提出申诉。 - Ignacio Soler Garcia
非常感谢,你的信息也解决了我的问题 :). 我有一个重写规则从example.azureedge.net到www.example.com,删除这个规则解决了问题。我还有一些规则,用于非www到www重定向和http到https,似乎没有干扰。 - mhvis
4
我们需要跨越许多复杂的障碍才能做一些本应该直接出现或者只需要进行基本配置的事情,这真是太不可思议了。我是AWS专业人员,但是我的客户与微软有一定的联系,所以我被迫进入这个痛苦的世界。Azure出现了一个问题又一个问题,而我在网上找到的所有解决方案都是“肮脏”的技巧。似乎每个解决方案都是通过某种“肮脏”的技巧来解决的——为什么他们不能真正投资于有能力的UX设计师和工程师上,而我们却要失去数周的开发时间来解决这些问题呢... - Ben Carey
非常感谢您回来并发布这个答案 - 虽然我还不知道它是否适用于我(仍在传播中),但根据它的作用,我相当有信心,或者至少可以让我了解它的工作原理,以便自己解决。这又引出了另一件事......为什么我们必须等待长达4个小时(有时更长时间)才能进行规则传播。他们显然要手动审核每个规则!!!不是开玩笑!如果您还没有尝试过AWS,请务必尝试一下 - 您将永远不会回头......(2/2) - Ben Carey
这对我有用,但值得三倍强调的是,在它起作用之前,需要在整个团队中传播一段时间。添加规则后,我仍然有清除不起作用的情况 - 但第二天清除就非常快了。 - oatsoda

2
我发现如果你单独清除每个文件,例如,在清除时将/css/main.css放入“内容路径”而不是“全部清除”,它会起作用。

我也发现了这个问题,但是被接受的答案解决了它。我猜重写规则干扰了全部清除,但可能不会影响特定文件清除。 - oatsoda

1

2019年10月14日 - 我使用了类似的设置(Azure CDN/Blob-Static-Site/Verizon),也遇到了缓存问题。我只有一个URL重写规则。解决方法是设置一个关于缓存/Max-Age的后续规则。

这是我的操作步骤:

Azure 门户 -> CDN 配置文件 -> 点击您的配置文件(概述部分)

  1. 在概述中单击管理图标(详细信息部分/刀片)。这将打开烂网页 Verizon 页面。
  2. 悬停在“Http Large”上,然后单击“Rules Engine”
  3. 在文本框中输入名称/描述。例如:“Force Cache Refresh”
  4. 保留 If/Always 选项
  5. 单击特征旁边的“+”按钮
  6. 在新的下拉列表中选择“Force Internal Max-Age”(将响应保留为200)
  7. 在字段中输入合理*的秒数。(例如300)
  8. 单击黑色添加按钮

它说这个规则可能需要4个小时才能生效,但对我来说只需要2个小时。

最后,对于这种方法,规则的顺序不应该重要,但对于上面的重写规则,请记住规则允许您根据优先级上下移动它们。对我来说,第一是Https重定向,第二是Url重写(用于“React-routing”),最后是强制缓存刷新。
*注意:这是一种平衡,因为清除不适用于我,您希望静态应用/网站在发布后更新,但您也不希望有大量不必要的流量来刷新缓存。对于我的开发服务器,我选择了5分钟。我认为生产环境将是1小时...还没有决定。

0

现在一切正常了吗? 我看到你的规则可能比你需要的更复杂。如果目标只是将根“/”重写为“/index.html”,那么这是您唯一需要的规则:

如果始终如此 URL重写-源:“/”; 目标“/index.html”


一切似乎都在正常工作,尽管我还没有机会测试对容器中所有 blob 的完整更新,然后通过 CDN 访问它并应用规则。我对规则的复杂性很好奇,但我还没有时间坐下来仔细研究它们,以决定是否有更简单的选项(尽管根据我所读的文档,我认为您是正确的)。更改规则需要最多 4 小时的时间,因此如果当前功能正常,则优化这部分内容将排在我的任务列表底部。 - jpetitte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接