11

当我的 CloudFront 源包含set-cookie响应中的标头时:CloudFront 是否会缓存响应的标头set-cookie header?如果没有,是否有 CDN 可以?

4

3 回答 3

6

答案并不像“是”或“否”那么简单。是的,CloudFront 将“通过”set-cookie 标头,但不,它不会缓存 set-cookie 标头。这可以通过简单地上传一个测试页面来测试,该页面返回一个带有随机值的 set-cookie 标头并重复加载该页面。

CloudFront 将传递请求 cookie 并返回已在分配的“行为”部分中列入白名单的 cookie 的 set-cookie 标头(或所有 cookie,如果这样配置)。任何包含白名单 cookie 的 set-cookie 标头的响应都不会被缓存。

还应注意,CloudFront 将其对象 ID 中任何列入白名单的 cookie 的值用于缓存对象。一个特别重要的情况是会话 ID 或用户特定的 cookie - 用户在第一次查看页面时总是会遇到缓存未命中,因为 CloudFront 使用 URL 和 cookie 的值来识别缓存的页面。

于 2017-08-15T02:51:17.700 回答
3

答案是肯定的,他们会。他们在配置分配以允许无/白名单/全部时有下拉菜单

于 2012-10-28T16:21:40.337 回答
1

扩展@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);
};
于 2020-09-14T15:02:54.527 回答