如果我为cloudfront执行自定义源并且返回set-cookie标头,那么cloudfront会为响应缓存set-cookie标头吗?如果没有,是否会有CDN?
答案 0 :(得分:4)
答案并不像"是"那么简单。或"没有。"是的,CloudFront将通过" set-cookie标头,但不,它不会缓存set-cookie标头。这可以通过简单地上传一个返回带有随机值的set-cookie标头的测试页面并重复加载页面来测试。
CloudFront将传递请求Cookie并返回已在"行为"中列入白名单的Cookie的set-cookie标头分发的部分(或所有cookie,如果这样配置)。包含白名单cookie的set-cookie标头的任何响应都不会被缓存。
还应注意,CloudFront在其对象ID中使用任何列入白名单的cookie的值作为缓存对象。一个特别重要的情况是会话ID或用户特定的cookie - 用户在第一次查看页面时将始终遇到缓存未命中,因为CloudFront正在使用URL和cookie的值来标识缓存页面。 / p>
答案 1 :(得分:3)
答案是肯定的,他们这样做。配置分发时,它们具有下拉列表以允许无/白名单/全部
答案 2 :(得分:0)
通过@ anthony-disanti扩展出色的答案,可以通过执行以下步骤将要缓存的(公共)内容加载到CloudFront中:
public, no-cache="Set-Cookie", max-age=86400
在我们的asp.net核心应用程序具有一些公共网页的情况下,从CloudFront提供服务时,公共网页的响应时间从120毫秒降低到20毫秒。并且从磁盘缓存放到1毫秒时。在这种情况下,Cookie名称为“ .AspNetCore.Session”。
当您不转发cookie时,CloudFront将不会缓存,因为每个原始响应都包含set-cookie标头。
如果您无法更改原点的行为,则可能需要考虑在“原点响应”上使用Lambda @ edge触发器,例如:
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
if(response.headers['cache-control'])
{
response.headers['cache-control'] = [{
key: 'Cache-Control',
value: 'public, max-age=604800, no-cache="Set-Cookie"'
}];
}
callback(null, response);
};