如何确保我的 CDN 按来源缓存 CORS 请求?

Posted

技术标签:

【中文标题】如何确保我的 CDN 按来源缓存 CORS 请求?【英文标题】:How to ensure my CDN caches CORS requests by origin? 【发布时间】:2018-08-30 23:14:26 【问题描述】:

我目前使用 Akamai 作为我的应用程序的 CDN,通过多个子域提供服务。

我最近意识到 Akamai 以相同的方式缓存 CORS 请求,无论请求的来源如何。

这当然会导致使用与缓存响应不同的Origin 发出请求的客户端失败(因为它们对Access-Control-Allow-Origin 的响应标头与应有的不同)

许多人建议提供 Vary: Origin 请求标头以避免此问题,但 according to Akamai's docs 和 this Akamai community post,这不受 Akamai 支持。

如果请求中存在 Origin 标头,我如何强制 Akamai 通过 Origin 唯一地缓存内容?

【问题讨论】:

【参考方案1】:

我做了一些研究,看来这可以通过在您的 Akamai 配置中添加一个新的 Rule 来完成,如下所示:

请注意,如果您这样做 - 请记住 - 这会更改您在 Akamai 的缓存键,因此之前缓存的任何内容基本上都不再缓存了!此外,如黄色警告标签中所述,这会使使用 Akamai 的 url 清除工具强制重置缓存变得更加困难。您可以删除 If 块,并将 Origin 标头包含为类似的 Cache ID Modification 规则,如果您可以更改适用此规则的所有内容的缓存键。

因此,简而言之,首先在您网站的一小部分尝试一下!

更多详情可以查看in this related post on Stack Overflow

【讨论】:

【参考方案2】:

我们在 Akamai 上托管了一个 API。我有类似的要求,但我们希望将 Akamai 上的缓存响应用于所有接触点。但是在没有 CORS 设置的情况下,它用于缓存来自第一个源的响应,然后将其保存在缓存中,并且来自其他接触点的以下请求会由于缓存的源头而失败。

我们通过使用 Akamai 提供的 API Gateway 功能解决了这个问题。您可以在 API 定义下找到它。自定义缓存参数也可以在这里定义。请查看 CORS 设置的屏幕截图。现在它缓存了来自后端的响应,并根据允许的源列表提供给请求者。

CORS Setting in API Definition

【讨论】:

以上是关于如何确保我的 CDN 按来源缓存 CORS 请求?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

为啥我的 CORS 配置没有导致服务器过滤传入的请求?如何让服务器只接受来自特定来源的请求?

cdn请求原理以及缓存机制

从 Azure CDN 请求的字体文件被 CORS 策略阻止

IE9 重定向缓存、字体和跨域资源共享 (CORS) CDN HTTP 标头

如何确保对我的服务器的请求仅通过单一来源/用户界面起作用?