CloudFront 将自定义 Headers 转发到 Origin 但值为空

CloudFront forwarding Custom Headers to Origin but with null Values

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

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

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

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

进一步的设置包括以下内容:

我的应用有一个登录页面,其中不需要授权。成功登录后,应用程序会设置三个自定义 headers.

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

我的应用程序成功登录用户,但随后自动注销。因此,为了检查这个问题,我在授权 class 中编写了以下小代码来检查 header 值。

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 确实将 header 转发到我的来源,但具有空值。结果如下:

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

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

编辑

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

下面显示了我对 Login 方法的调用,正如预期的那样,它 returns 响应中设置了具有其他自定义 header 的 Auth 令牌。

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

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

任何帮助。谢谢

设置 Origin Custom Headers 将使 CloudFront 在对您的来源的每个请求中包含它们,如果 header 已经提供,它将被覆盖。这不是您想要的,这解释了为什么您看到 null 值(您添加了没有值的 headers)。

Origin Custom Headers 应仅用于常量值或当您明确需要覆盖 header.

在您的情况下,您需要在 缓存行为设置 中将 header 列入白名单,方法是在白名单 Headers 部分并单击 添加自定义 >> 如下所示:

(我保留了您的 授权主机 headers)

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

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