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

时间:2013-11-27 12:39:58

标签: http caching cdn cloudflare content-negotiation

我通过内容协商提供一系列资源。 具体地说,任何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表示形式,而不管其首选项如何。 Others have similar issues.

例如,如果我将CloudFlare置于graph.facebook.com之上(并将其配置为缓存“无扩展”资源,默认情况下不会这样),那么行为不正确:< / p>

  1. 我通过curl在JSON中要求http://graph.facebook.com/daft-punk;
    作为回应,CloudFlare从服务器请求JSON原件,缓存它并为其提供服务。
  2. 我通过浏览器询问http://graph.facebook.com/daft-punk(因此是HTML);
    作为响应,CloudFlare发送缓存的JSON(!)表示,即使原始服务器已发送HTML版本。
  3. 需要什么

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

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



    PS1:很容易让自己的缓存服务器支持它。例如,对于nginx:

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

    请注意客户端的Accept标头是如何为缓存编制索引的密钥的一部分。我希望在CDN上播放。


    PS2:不能为不同的表示使用不同的URL。我的应用程序位于Linked Data域中,其中URL在识别中起着重要作用。

2 个答案:

答案 0 :(得分:0)

似乎maxcdn仍然可以为内容协商设置自定义nginx规则(尽管他们的常见问题解答说明了) - http://blog.maxcdn.com/how-to-reduce-image-size-with-webp-automagically/#comment-1048561182

答案 1 :(得分:-2)

我想不出我们现在会对此产生任何影响。例如,我们不会cache HTML by default。你真的看到过这个问题吗?你有没有开过支持票?