我在Koltin中编写了一个Vertx web处理程序,它将我收到的任何HTTP请求重定向到HTTPS,我使用的是上下文。请求()。isSSL
来确定请求是否不是SSL,在我将代码放在负载平衡器后面之前,这一切都很正常。如果负载平衡器通过HTTPS与我的Vertx web服务器通信,那么它会认为所有用户请求都是HTTPS,即使它们不是。如果我将负载平衡器改为在HTTP上与Vertex web对话,那么即使用户已经在使用HTTPS,每个请求也会被无限重定向。
然后我还看到了另一个问题,即使用上下文重定向。请求()。absoluteURI()
转到用户实际通话的私人地址,而不是公开可用的地址。
Vertx web中是否有我缺少的处理程序可以实现这一点,或者有什么惯用的方法来解决这一问题?我是否应该从JavaScript中执行此操作,因为它可以看到真实的用户地址,而不是尝试服务器端重定向?
我是用Kotlin编写代码的,所以这门语言的任何例子都很棒!
注:本问题由作者有意撰写和回答(自答问题),以便在so中分享有趣问题的解决方案。
首先,最好是您的代理或负载平衡器可以为您执行此检查和重定向,因为它知道公共URL,并且在第一次与用户接触时是一个更简单的过程。但是,您也可以在服务器端完成,只需稍微复杂一点。
正在检查的标志,context。请求()。ISSL < /代码>仅适用于传入到VLTX Web的连接,并且不考虑终端用户连接到代理或负载均衡器。您需要使用
X-Forwarded-Proto
标题(有时还需要使用X-Forwarded-Scheme
)并检查用户的实际协议。只有当标题不存在时,才能使用上下文。请求()。isSSL
您还需要将自己的URL外部化,以便能够在服务器端重定向到浏览器可以用来查找您的内容,即您的公共URL。
首先,这个堆栈溢出应答中有一个Kotlin函数,用于
RoutingContext。externalizeUrl()
,您将需要它:
我有一个Vertx请求,需要计算一个外部可见(公共)URL
然后了解您的公共URL,您可以使用以下处理程序,该处理程序具有预期公共HTTPS端口的默认值(默认443将从URL中消失),重定向的形式(即302),以及如果路由失败或继续,则可以使用任何异常:
fun Route.redirectToHttpsHandler(publicHttpsPort: Int = 443, redirectCode: Int = 302, failOnUrlBuilding: Boolean = true) {
handler { context ->
val proto = context.request().getHeader("X-Forwarded-Proto")
?: context.request().getHeader("X-Forwarded-Scheme")
if (proto == "https") {
context.next()
} else if (proto.isNullOrBlank() && context.request().isSSL) {
context.next()
} else {
try {
val myPublicUri = URI(context.externalizeUrl())
val myHttpsPublicUri = URI("https",
myPublicUri.userInfo,
myPublicUri.host,
publicHttpsPort,
myPublicUri.rawPath,
myPublicUri.rawQuery,
myPublicUri.rawFragment)
context.response().putHeader("location", myHttpsPublicUri.toString()).setStatusCode(redirectCode).end()
} catch (ex: Throwable) {
if (failOnUrlBuilding) context.fail(ex)
else context.next()
}
}
}
}
一个更简单的版本可能是只信任
上下文。externalizeUrl
类,查看它是否具有正确的协议和端口,如果没有,则重定向:
fun Route.simplifiedRedirectToHttpsHandler(publicHttpsPort: Int = 443, redirectCode: Int = 302, failOnUrlBuilding: Boolean = true) {
handler { context ->
try {
val myPublicUri = URI(context.externalizeUrl())
if (myPublicUri.scheme == "http") {
val myHttpsPublicUri = URI("https",
myPublicUri.userInfo,
myPublicUri.host,
publicHttpsPort,
myPublicUri.rawPath,
myPublicUri.rawQuery,
myPublicUri.rawFragment)
context.response().putHeader("location", myHttpsPublicUri.toString()).setStatusCode(redirectCode).end()
}
else {
context.next()
}
} catch (ex: Throwable) {
if (failOnUrlBuilding) context.fail(ex)
else context.next()
}
}
}
我想将所有可能的url组合重定向到单个路径。 例如。 http:/例如。com--- https:/例如。com-- 超文本传输协议/example.com/abc/cde 我可以按照mod_rewrite设置处理1和3的情况,但不能执行2重定向,这有人可以帮我。 为了避免链接转换,我在网站示例中使用了escape one/in。 重新启动引擎 重写Cond%{HTTPS}关闭 重写Cond%{H
我们的整个网站将通过https提供服务。我在每条路线上都有“https”。但是,如果他们试图通过http将其重定向到https,我该如何将其重定向到https?
当我们使用AWS应用型负载均衡将传入请求重定向到我们的服务器时,我们创建了一个SSL证书并将其设置为负载均衡器。它同时监听HTTP 80和HTTPS 443端口的流量。在这两种情况下,流量都被重定向到目标组实例的HTTP 80端口。 在这些情况下,有nginx服务器配置为侦听它们所在的实例的HTTP 80端口。 当我更新nginx.conf文件以将传入的HTTP请求重定向到HTTPS协议时,我们面
问题内容: 这是我的standalone-full.xml配置,其中ssl配置了 security realm . Subsystem Socket Binding 问题答案: 重写规则可用于重定向用户。在undertow子系统(standalone.xml或domain.xml)中,你需要创建一个新的重写过滤器,然后在新的fitler-ref中启用该过滤器: 在过滤器部分中创建新的重写过滤器。在
我将Vertx 3与Kotlin一起使用,有时我需要从公共URL的角度返回特定的URI,这与Vertx web请求认为我的URL不同。这可能是因为我的负载平衡器或代理收到一个URL,然后通过内部URL转发到我的应用程序。 所以如果我这么做: 我最终得到了一个像而不是。那个网址的一切都错了! 我发现了一个标题,它应该告诉我更多关于原始请求的信息,比如,但它只包括或有时它有端口但这还不足以计算出URL
我的项目体系结构由一个配置了 SSL 的负载均衡器组成。SSL 配置在负载均衡器处终止,请求将转发到 HTTP 的 Web 服务器和应用服务器。当用户首次访问应用程序时,Spring Security会尝试使用HTTP协议重定向到登录页面。由于负载均衡器侦听 HTTPS,因此此请求将失败。 考虑到Web服务器将始终在HTTP上转发到应用程序服务器,我该怎么做才能确保在创建重定向请求时使用HTTPS