我通过内容协商来提供一系列资源。具体来说,任何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
上(并配置它来缓存“无扩展名”的资源,这不是其默认值),那么它将表现不正确:
- 我通过curl以JSON形式请求
http://graph.facebook.com/daft-punk
;
作为响应,CloudFlare从服务器请求JSON原始数据、将其缓存并返回。 - 我通过浏览器以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对于标识非常重要。
Vary: Accept
,这会告诉缓存接受头部影响响应。 - letmaik