Amazon CloudFront 是不是通过 set-cookie 标头?
Posted
技术标签:
【中文标题】Amazon CloudFront 是不是通过 set-cookie 标头?【英文标题】:Does Amazon CloudFront pass through set-cookie headers?Amazon CloudFront 是否通过 set-cookie 标头? 【发布时间】:2012-10-15 04:55:46 【问题描述】:当我的 CloudFront 源在响应中包含 set-cookie
标头时:CloudFront 是否会缓存 set-cookie header
以用于响应?如果没有,是否有 CDN 可以?
【问题讨论】:
【参考方案1】:答案并不像“是”或“否”那么简单。是的,CloudFront 将“通过”set-cookie 标头,但不,它不会缓存 set-cookie 标头。这可以通过简单地上传一个返回带有随机值的 set-cookie 标头的测试页面并重复加载页面来进行测试。
CloudFront 将传递请求 cookie 并返回已在分配的“行为”部分中列入白名单的 cookie 的 set-cookie 标头(或所有 cookie,如果这样配置)。任何包含白名单 cookie 的 set-cookie 标头的响应都不会被缓存。
还应注意,CloudFront 在其缓存对象的对象 ID 中使用任何列入白名单的 cookie 的值。一个特别重要的情况是会话 ID 或用户特定的 cookie - 用户在第一次查看页面时总是会遇到缓存未命中,因为 CloudFront 使用 URL 和 cookie 的值来识别缓存的页面。
【讨论】:
【参考方案2】:答案是肯定的,他们会。他们在配置分配以允许无/白名单/全部时有下拉列表
【讨论】:
虽然 CloudFront 允许您将分配配置为使用 cookie,但该功能无法按照问题中的描述工作。请在下面查看我的答案。【参考方案3】:扩展@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 标头。
当您无法更改源的行为时,您可能需要考虑在 Origin Response 上使用 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);
;
【讨论】:
以上是关于Amazon CloudFront 是不是通过 set-cookie 标头?的主要内容,如果未能解决你的问题,请参考以下文章
将 Amazon 的 CloudFront 指向 A 记录而不是 CNAME
Amazon S3 无法通过 Cloudfront 上传文件
通过 S3 从 Amazon CloudFront 提供 gzip 后的 CSS 和 JavaScript