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

如何为 Amazon CloudFront 签署 RTMP URL

Amazon CloudFront 延迟

如何彻底清除 Amazon CloudFront 缓存?