哪些CDN解决方案支持使用内容协商进行缓存?

13

我通过内容协商来提供一系列资源。具体来说,任何URL都可以表示为不同的格式,这取决于客户端的Accept头。

在Facebook上可以看到这样的示例:

  • curl -H "Accept: application/json" http://graph.facebook.com/daft-punk
    将得到JSON结果
  • curl -H "Accept: text/turtle" http://graph.facebook.com/daft-punk
    将得到Turtle结果

我正在寻找一个基于URL和客户端Accept头缓存内容的CDN

错误示例

CloudFlare不支持此功能:如果一个客户端要求HTML,则该URL的所有后续请求都将收到HTML表示,而不考虑他们的首选项。其他人也有类似的问题。

例如,如果我把CloudFlare放在graph.facebook.com上(并配置它来缓存“无扩展名”的资源,这不是其默认值),那么它将表现不正确

  1. 我通过curl以JSON形式请求http://graph.facebook.com/daft-punk
    作为响应,CloudFlare从服务器请求JSON原始数据、将其缓存并返回。
  2. 我通过浏览器以HTML形式请求http://graph.facebook.com/daft-punk
    作为响应,CloudFlare发送缓存的JSON(!)表示,尽管原始服务器会返回HTML版本。

需要什么

正确的行为是CloudFlare再次请求服务器,因为第二个客户端有不同的Accept头。之后,类似Accept头的请求可以从缓存中提供。

哪些CDN解决方案支持内容协商,并且还可以缓存协商的内容?
请注意,仅尊重Accept是不够的;协商响应也应该被缓存。



PS1:使您自己的缓存服务器支持此功能很容易。例如,对于nginx:

proxy_cache_key "$scheme$host$request_uri$http_accept";

注意客户端的Accept标头是索引缓存的关键部分。我希望CDN也能实现这个功能。


PS2:不能为不同表示使用不同的URL。我的应用程序是在链接数据领域中,其中URL对于标识非常重要。


首先需要修复的是 Facebook 服务器头部。我认为它们缺少 Vary: Accept,这会告诉缓存接受头部影响响应。 - letmaik
@neo 是的,但是对于正确设置“Vary”头的服务器仍然无效。 - Ruben Verborgh
2个回答

0

谢谢你的指点。我不确定内容协商在MaxCDN中是否普遍适用,还是仅在优化图像时有效。我会去问一下这个问题。 - Ruben Verborgh
更新:MaxCDN已确认他们通常不支持缓存内容协商响应。 - Ruben Verborgh

-2

我目前想不到我们会对此产生任何影响的方式。例如,我们不会默认缓存HTML。您是否真正遇到了这个问题?您是否已经开了一个支持工单?


1
我在开始这个线程之前已经创建了一个支持请求(#68719)。工作人员非常乐意提供帮助,但他们确认CloudFlare不支持缓存内容协商响应。他们还表示,“在近期的路线图中没有添加该功能”。默认情况下是基于扩展名,因此.html _extension_的文件确实不会被默认缓存(但这可以改变)。 问题:尝试缓存任何具有内容协商的网站。只有第一次服务的表现形式被缓存,并且无论新客户端的“Accept”头如何,都会被重复提供服务。这在将来会有所改善吗? - Ruben Verborgh
问题已更新,附上了CloudFlare(以及我测试过的其他服务)出现问题的示例。 - Ruben Verborgh

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