通过 https 发出原始请求时在 Location-header 中获取 http

Posted

技术标签:

【中文标题】通过 https 发出原始请求时在 Location-header 中获取 http【英文标题】:Getting http in the Location-header when the original request was made over https 【发布时间】:2019-05-29 17:14:48 【问题描述】:

我的问题:

1) 当来自浏览器的原始请求是使用 https 发出时,为什么我在 Location-header 中获得 http 作为方案?

2) 这是一个 Wildfly 负载均衡器问题吗?

我的请求标头是:

method: POST
scheme: https
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
content-length: 39
content-type: application/x-www-form-urlencoded
origin: https://10.43.201.207
referer: https://10.43.201.207/myapp/login.html

我的响应标头是:

content-length: 0
date: Thu, 03 Jan 2019 04:55:42 GMT
location: http://10.43.201.207/myapp/dashboard.html?init=1
server: WildFly/12
set-cookie: APP_AUTH=leTPWYd1222zsrrtRRtgpuEWEWc7pR0CBuNPYPT5QHbGn_Db7ICK; path=/; secure; HttpOnly
set-cookie: JSESSIONID="leTee33333PWYdSDSDweetRRtgpuc7pR0CBuNPYPT5QHbGn_Db7ICK.master-0:master-server"; Version=1; Path=/myapp; Secure; HttpOnly
status: 302
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-powered-by: Undertow/1
x-xss-protection: 1; mode=block

【问题讨论】:

这似乎是一个重定向。 嗨罗伯特,是的,它只是重定向,但我们并不是说像使用 http 重定向。在我们的 LoginServlet 代码中,我们在 doPost 方法 response.sendRedirect("dashboard.html" ); 中编写如下 在评论您的问题之前,我做了一些研究。这似乎表明可以在实现 TLS 握手之前发生重定向。 那么我是否需要将我的 LoginServlet 代码更改为 http 替换为 https ?还是我缺少一些负载均衡器配置? 您好,我对此一无所知,为什么响应标头以 http 形式出现,有人可以在这里建议我如何解决这个问题吗? 【参考方案1】:

负载均衡器是否剥离了 TLS 并将请求作为 HTTP 转发到应用程序?如果是这样,那么应用程序在执行重定向时,它可能使用与接收请求相同的协议。

如果是这种情况,要么让应用强制https,要么让负载平衡器重写返回的响应。

您可能需要设置proxy-address-forwarding="true" 和/或request_header_add X-Forwarded-Proto https

【讨论】:

嗨 Mennon,我该如何检查: - 负载均衡器正在剥离 TLS 并将请求作为 HTTP 转发到应用程序? 您可以检查 TLS 证书的设置位置 - 如果它在负载均衡器上,那么它正在处理解密,如果它在应用程序(或应用程序服务器)上,那么就是这样。或者,如果不是您设置 TLS,请询问设置 TLS 的人员/团队。 @Mennon 和@Subodh,我们在wildfly 应用服务器配置中添加了proxy-address-forwarding="true",它起作用了 另一个简单的解决方法是根本不在 Location 标头字段中设置方案【参考方案2】:

以下是上述问题的详细解决方案说明:

我们在两台 Wildfly 服务器前面有一个负载均衡器。负载均衡器处理 SSL 握手并强制所有流量通过 https,wildfly 节点上没有证书,负载均衡器和服务器之间的流量未加密,wildfly 节点对 SSL 一无所知。负载均衡器之间的通信Wildfly 节点是通过http 协议实现的。

当用户点击受保护的页面时,例如https://someip/app

请求流程如下:

客户端浏览器通过https负载均衡器 负载均衡器通过http 协议连接到wildlfy 节点。 在wildlfy服务器节点的http中添加了proxy-address-forwarding="true" 听众

【讨论】:

【参考方案3】:

另一种选择是让负载均衡器将 Strict-Transport-Security 标头添加到服务器响应中,例如:

Strict-Transport-Security max-age=300;

这将有效地告诉客户端他应该始终使用 https 来联系您的服务器。

【讨论】:

以上是关于通过 https 发出原始请求时在 Location-header 中获取 http的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 ​​GET url

AFNetworking 通过 HTTPS 发出 post 请求

如何查看 Postman 在发出 OAuth 请求时使用的原始签名?

向 wcf 服务发出 https 请求:根据验证程序,远程证书无效

是否可以从 HTTPS 向 HTTP 发出 JSONP 请求?

无法向本地服务器发出 HTTPS 请求