Amazon Cloudfront是否通过set-cookie标头?

时间:2012-10-25 03:50:25

标签: cdn amazon-cloudfront

如果我为cloudfront执行自定义源并且返回set-cookie标头,那么cloudfront会为响应缓存set-cookie标头吗?如果没有,是否会有CDN?

3 个答案:

答案 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中:

  • 将特定Cookie列入白名单。这样就可以将Cookie返回到第一个查看器,并在第一次刷新后再次发送。
  • 通过使用类似public, no-cache="Set-Cookie", max-age=86400
  • 的缓存控件,避免将Set-Cookie标头包含在缓存键中,从而进行缓存。

在我们的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);
};