当我的 CloudFront 源包含set-cookie
响应中的标头时:CloudFront 是否会缓存响应的标头set-cookie header
?如果没有,是否有 CDN 可以?
3 回答
答案并不像“是”或“否”那么简单。是的,CloudFront 将“通过”set-cookie 标头,但不,它不会缓存 set-cookie 标头。这可以通过简单地上传一个测试页面来测试,该页面返回一个带有随机值的 set-cookie 标头并重复加载该页面。
CloudFront 将传递请求 cookie 并返回已在分配的“行为”部分中列入白名单的 cookie 的 set-cookie 标头(或所有 cookie,如果这样配置)。任何包含白名单 cookie 的 set-cookie 标头的响应都不会被缓存。
还应注意,CloudFront 将其对象 ID 中任何列入白名单的 cookie 的值用于缓存对象。一个特别重要的情况是会话 ID 或用户特定的 cookie - 用户在第一次查看页面时总是会遇到缓存未命中,因为 CloudFront 使用 URL 和 cookie 的值来识别缓存的页面。
答案是肯定的,他们会。他们在配置分配以允许无/白名单/全部时有下拉菜单
扩展@anthony-disanti 的出色答案,可以通过执行以下步骤将要缓存的(公共)内容加载到 CloudFront 中:
- 将特定 cookie 列入白名单。这允许 cookie 返回给第一个查看器并在第一次刷新时再次发送。
- 通过使用缓存控制避免 Set-Cookie 标头包含在缓存键中来允许缓存,例如:
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);
};