AWS 负载均衡器 - 未传递 HTTP 响应标头
Posted
技术标签:
【中文标题】AWS 负载均衡器 - 未传递 HTTP 响应标头【英文标题】:AWS Load Balancer - HTTP Response Headers not passed 【发布时间】:2021-10-18 03:29:16 【问题描述】:我在使用 EB 时遇到了问题,希望能得到帮助。
我有一个使用 nginx 在端口 80 上路由 nextjs + 烧瓶流量的 HTTP 站点。该站点的本地版本运行良好,香草 Elastic Beanstalk 上传也是如此。设置和使用负载均衡器时会遇到问题。目前我正在使用“经典负载均衡器”,它连接到 Cloud Front 分配。发生的事情是响应标头没有传递回客户端。
标头应该是什么样子:[HTTP 上没有负载平衡器]
HTTP/1.1 400 Bad Request
Server: nginx/1.17.10
Date: Mon, 16 Aug 2021 01:10:02 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: state=; Max-Age=0; Path=/
Set-Cookie: _state=; Max-Age=0; Path=/
Set-Cookie: max_age=; Max-Age=0; Path=/
Set-Cookie: _max_age=; Max-Age=0; Path=/
Set-Cookie: code_verifier=; Max-Age=0; Path=/
Set-Cookie: _code_verifier=; Max-Age=0; Path=/
Set-Cookie: nonce=; Max-Age=0; Path=/
Set-Cookie: _nonce=; Max-Age=0; Path=/
它们的实际外观:[在 HTTP/HTTPS 上使用负载均衡器 + 云端]
HTTP/1.1 500 Internal Server Error
Transfer-Encoding: chunked
Connection: keep-alive
Server: nginx/1.17.10
Date: Mon, 16 Aug 2021 01:11:27 GMT
X-Cache: Error from cloudfront
Via: 1.1 71d15e4317f9ba4644f6c17f42ef94c9.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: MXP64-C2
X-Amz-Cf-Id: BYxDl-eFkhRPzAsPUxFv8gxOYT1jeDL6yoPjwqzZ2u4qcSS20B4ReQ==
我尝试通过 HTTP 访问 Cloud Front url,但标题仍然没有显示。弹性负载均衡器文档指出“如果您在应用程序 cookie 的 Set-Cookie 字段中有一个尾随分号,负载均衡器将忽略该 cookie”。上面的例子是否符合条件?如果是的话,有什么办法可以解决这个问题吗?
【问题讨论】:
我认为您在这里关注错误的部分。这两个请求给出了不同的响应代码,400 与 500(这可能也解释了不同的标头)。查看您的服务器日志,了解为什么它在从云端请求时返回 500。 尝试从响应头读取值时,由于出现空错误,因此返回 500 错误。 试图从响应中读取什么? 该请求是对 NextJS /api/auth/login 调用的代理传递,该调用尝试读取各种身份验证参数(在此特定实例中未能这样做)。 【参考方案1】:我设法通过将 Classic Load Balancer 替换为 Application Load Balancer 来解决此问题,并使用它将我的 HTTP 请求重定向到 HTTPS 而不是 Cloudfront。
这可以通过在端口 433 上侦听重定向到默认目标的单个 HTTPS 侦听器来完成。作为该过程的一部分,还需要选择一种安全策略(任何都可以)并分配相关的 SSL 证书。
点击上面显示的默认目标(或等效)。如果不存在目标,请单击“创建目标组”并在下一页中注册一个来源。 (在我的例子中,我选择了我的 Elastic Beanstalk 应用程序)。
通过 Application Load Balancer 提供服务的应用程序可以通过访问其 DNS 进行测试。
【讨论】:
以上是关于AWS 负载均衡器 - 未传递 HTTP 响应标头的主要内容,如果未能解决你的问题,请参考以下文章