我通过内容协商提供一组资源。
具体来说,任何 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
上(并将其配置为缓存“无扩展”资源,默认情况下它不会缓存),那么它会表现错误地:
- 我通过 curl 在 JSON 中请求
http://graph.facebook.com/daft-punk
;
作为响应,CloudFlare 从服务器请求原始 JSON,将其缓存并提供。 - 我通过浏览器请求
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/