我正在为Google App Engine上的应用程序开发后端系统。
我的应用程序和后端服务器与json通信。例如http://server.example.com/api/check_status/3838373.json或仅http://server.example.com/api/check_status/3838373/
我计划使用CloudFlare来缓存JSON页面。
我应该在标题上使用哪一个? :
Content-type: application/json
Content-type: text/html
CloudFlare缓存我服务器的响应以降低成本吗?因为我不会使用CSS,图像等
答案 0 :(得分:14)
标准Cloudflare缓存级别(在您的域的性能设置下)设置为标准/积极,这意味着它默认只缓存某些类型scripts, stylesheets, images。积极的缓存不会缓存正常的网页(即在目录位置或* .html),也不会缓存JSON。所有这些都是基于URL模式(例如,它以.jpg结尾吗?)而不管Content-Type标头。
全局设置只能降低攻击性,而不是更多,因此您需要使用Cache Everything作为自定义缓存规则来设置一个或多个页面规则以匹配这些URL。
http://blog.cloudflare.com/introducing-pagerules-advanced-caching
BTW我不建议使用HTML Content-Type进行JSON响应。
答案 1 :(得分:1)
默认情况下,Cloudflare不缓存JSON文件。我最终配置了一个新的页面规则:
https:/domain.com/sub-directiory/*.json*
希望它可以节省某人的一天。
答案 2 :(得分:0)
新的workers功能(额外收费$ 5)可以简化此操作:
重点: 通常,Cloudflare将普通的静态文件视为几乎永不过期(或者可能是一个月,我完全忘记了)。
因此,起初您可能会想到"I just want to add .json to the list of static extensions"
。 JSON可能不希望这样-除非确实很少更改-或按文件名进行版本控制。您可能想要60秒或5分钟之类的时间,这样,如果您更新文件,文件将在此时间内更新,但您的服务器将不会受到来自每个最终用户的单独请求的轰炸。
这是我与工作人员进行的操作,以拦截所有.json
扩展文件:
// Note: there could be tiny cut and paste bugs in here - please fix if you find!
addEventListener('fetch', event => {
event.respondWith(handleRequest(event));
});
async function handleRequest(event)
{
let request = event.request;
let ttl = undefined;
let cache = caches.default;
let url = new URL(event.request.url);
let shouldCache = false;
// cache JSON files with custom max age
if (url.pathname.endsWith('.json'))
{
shouldCache = true;
ttl = 60;
}
// look in cache for existing item
let response = await cache.match(request);
if (!response)
{
// fetch URL
response = await fetch(request);
// if the resource should be cached then put it in cache using the cache key
if (shouldCache)
{
// clone response to be able to edit headers
response = new Response(response.body, response);
if (ttl)
{
// https://developers.cloudflare.com/workers/recipes/vcl-conversion/controlling-the-cache/
response.headers.append('Cache-Control', 'max-age=' + ttl);
}
// put into cache (need to clone again)
event.waitUntil(cache.put(request, response.clone()));
}
return response;
}
else {
return response;
}
}
您可以使用mime-type而不是扩展名来执行此操作-但这非常危险,因为您可能最终会过度缓存API响应。
如果要通过文件名进行版本控制-例如。 products-1.json
/ products-2.json
,则无需设置max-age
到期的标头。
答案 3 :(得分:0)
您可以在 Cloudflare 上缓存您的 JSON 响应,类似于缓存任何其他页面的方式 - 通过设置 Cache-Control
标头。因此,如果您想在边缘 (s-maxage
) 和浏览器 (max-age
) 上缓存 JSON 60 秒,只需在响应中设置以下标头:
Cache-Control: max-age=60, s-maxage=60
您可以在此处阅读有关不同缓存控制标头选项的更多信息:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
请注意,不同的 Cloudflare 计划允许的最小边缘缓存 TTL 值不同(企业计划允许低至 1 秒)。如果您的标头的值低于该值,那么我想它们可能会被忽略。您可以在此处查看限制: