http - 哪些 CDN 解决方案支持通过内容协商进行缓存?

标签 http caching cdn cloudflare content-negotiation

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

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

  • curl -H "Accept: application/json"http://graph.facebook.com/daft-punk
    JSON 格式的结果
  • curl -H "Accept: text/turtle"http://graph.facebook.com/daft-punk
    海龟结果

我正在寻找一个 CDN,它根据 URL 和客户端的 Accept header 缓存内容。

错误示例

CloudFlare 不支持这一点:如果一个客户端请求 HTML,那么对该 URL 的所有后续请求都会收到 HTML 表示,无论他们的偏好如何。 Others have similar issues.

例如,如果我将 CloudFlare 放在 graph.facebook.com 上(并将其配置为缓存“无扩展”资源,默认情况下它不会缓存),那么它会表现错误地:

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

需要什么

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

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



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

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

请注意客户端的 Accept header 如何成为索引缓存的键的一部分。我想要 CDN 上的那个。


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

最佳答案

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

关于http - 哪些 CDN 解决方案支持通过内容协商进行缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20242780/

相关文章:

android - http获取传参

asp.net - asp :RadioButtonList 'RepeatLayout' being ignored through CDN

css - CDN 上的 Selectivizr 和 CSS 不起作用

HTTP 请求不适用于 aws ec2

c# - 如何在 C# 中通过 HTTP 发送和接收大文件

python - 类 X 的 __new__ 方法中的 X 类型的 Unpickling 对象在返回 unpickled 对象时调用 __init__,为什么?

caching - 基于子域的 AWS CloudFront 缓存

Azure CDN 默认文档index.html

http - 当无法使用 HTTPS 时,通过 HTTP 保护数据传输

c# - HttpWebRequest.CachePolicy : questions about caching