【问题标题】:CloudFront forwarding Custom Headers to Origin but with null ValuesCloudFront 将自定义标头转发到 Origin 但具有空值
【发布时间】:2019-09-13 11:31:19
【问题描述】:

过去几年我一直在使用 AWS EC2。现在我想在我用 ASP 开发的应用程序上启用 HTTPS。 NET WEB API 与 AngularJS 中的前端。为此,我制作了 CloudFront 分发版。它已成功加载静态文件并调用 IIS 中托管的 EC2 上的 REST API。但不幸的是,当请求从 CloudFront 发送到我的源时,自定义标头具有 null 作为值。

我在 CloudFront 分发上做了以下相关配置。

以下是我对自定义来源标头的设置。

以下是我对缓存行为的设置。

进一步的设置包括:

  • 白名单 Cookie:授权、VDName
  • 查询字符串转发和缓存:全部转发,基于全部缓存
  • 源协议策略:仅 HTTP
  • 查看器协议策略:将 HTTP 重定向到 HTTPS

我的应用有一个不需要授权的登录页面。成功登录后,应用会设置三个自定义标题。

  1. 授权
  2. x-working-company
  3. x-working-branch

我的应用程序已成功登录用户,但随后自动将其注销。因此,为了检查这个问题,我在 Authorization 类中编写了以下小代码来检查标头值。

valToUpd.Add("S6", "CHK1");
valToUpd.Add("S7", "Before Null");
valToUpd.Add("S8", request.Headers.Count().ToString());
valToUpd.Add("S9", request.Headers.GetValues("Authorization").Single());
valToUpd.Add("S10", request.Headers.GetValues("x-working-company").Single());
valToUpd.Add("S11", request.Headers.GetValues("x-working-branch").Single());
var toUpdt = "";
if (request.Headers.Any(x => x.Key == "Authorization"))
    toUpdt = "A-";
if (request.Headers.Any(x => x.Key == "x-working-company"))
    toUpdt += "C-";
if (request.Headers.Any(x => x.Key == "x-working-branch"))
    toUpdt += "B-";
var ds = request.Headers.Where(x => x.Key == "x-working-branch").Select(c => c.Value);
toUpdt += " br val = ";
foreach (var item in ds)
{
    foreach (var i in item)
    {
        toUpdt += i + " - ";
    }
}
valToUpd.Add("S12", toUpdt);
usersHelperAdo.Update("Users", whereClause, valToUpd); // Its my DAL method to update values in Users table as per the where clause.

正如预期的那样,CloudFront 确实将标头转发到我的来源,但值为空。结果如下:

以下是 FireFox 开发人员模式,我的前端向 CloudFront 发送请求,其中包含所有具有适当值的自定义标头。但随后 CloudFront 将这些标头转发到源,但将值设为空。

那么,我做错了什么?为什么 CloudFront 在我的标头中将 null 作为值传递。非常感谢任何帮助。非常感谢!

编辑

我尝试使用 Postman 访问 API,以下是屏幕截图。

以下显示了我对 Login 方法的调用,并且正如预期的那样,它返回了 Auth 令牌,并在响应中设置了其他自定义标头。

我从响应中提取了所需的标头并发送另一个 GET 请求并收到以下内容。

它会抛出 403 禁止错误。奇怪的是,在浏览器开发模式下它会抛出 401 Unauthorized 错误,而在 Postman 中它是 403 Forbidden。

任何帮助。谢谢

【问题讨论】:

    标签: amazon-web-services asp.net-web-api amazon-ec2 amazon-cloudfront


    【解决方案1】:

    设置 Origin 自定义标头 将使 CloudFront 将它们包含在对您的源的每个请求中,如果已提供标头,则它会被覆盖。这不是您想要的,这解释了为什么您会看到 null 值(您添加了没有值的标题)。

    Origin Custom Headers 应该仅用于常量值或当您明确需要覆盖一个标题时。

    在您的情况下,您需要通过在 Whitelist Headers 部分输入 x-working-branchx-working-company 并单击 Cache Behavior Settings 将标头列入白名单em>添加自定义 >> 如下所示:

    (我保留了您的 AuthorizationHost 标头)

    请注意转发标头会影响缓存:根据标头值创建单独的版本。另见Caching Content Based on Request Headers。这意味着AuthorizationHostx-working-branchx-working-company 的不同组合将导致不同的版本(这显然是您想要避免将相同的内容提供给不同的用户)。这也适用于查询字符串和 cookie。

    了解 CloudFront 如何缓存对象非常重要。文档中最重要的部分是Managing How Long Content Stays in an Edge Cache (Expiration)

    【讨论】:

    • 感谢您的回答。我已按照您在白名单中的建议添加了所有 4 个标头,并且在 Origin 自定义标头中只有 Content_type:application/json。我使我的分发无效以清除缓存。此外,我现在正在发送 no-cache 标头来缓存任何内容。但同样的错误正在发生。有什么线索吗?
    • 修改后您的 CloudFront 分配的状态是什么? 已部署还是仍进行中?当您看到 Deployed 时,请确保再次失效。
    • 好的。让我再做一次。我通过在对象路径中输入 /* 无效。这是清除所有缓存的正确方法吗?
    • 是的,并通过查看控制台中的 Status 列来确保您的修改已被应用(您应该看到 Deployed i> 那里)。
    • 不。我认为缓存行为存在问题。所以我想等待 24 小时,以便缓存可能会被清除,然后我会再次点击。否则,我已经摸不着头脑,过了整整 2 天,但没有任何帮助。感谢你的关心。点击后我会更新你
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 2020-02-13
    • 2017-11-20
    • 2021-10-01
    • 2022-10-09
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多