当前位置: 首页 > 知识库问答 >
问题:

在Vertx中,我需要将所有HTTP请求重定向到同一个URL,但HTTPS除外

顾单弓
2023-03-14

我在Koltin中编写了一个Vertx web处理程序,它将我收到的任何HTTP请求重定向到HTTPS,我使用的是上下文。请求()。isSSL来确定请求是否不是SSL,在我将代码放在负载平衡器后面之前,这一切都很正常。如果负载平衡器通过HTTPS与我的Vertx web服务器通信,那么它会认为所有用户请求都是HTTPS,即使它们不是。如果我将负载平衡器改为在HTTP上与Vertex web对话,那么即使用户已经在使用HTTPS,每个请求也会被无限重定向。

然后我还看到了另一个问题,即使用上下文重定向。请求()。absoluteURI()转到用户实际通话的私人地址,而不是公开可用的地址。

Vertx web中是否有我缺少的处理程序可以实现这一点,或者有什么惯用的方法来解决这一问题?我是否应该从JavaScript中执行此操作,因为它可以看到真实的用户地址,而不是尝试服务器端重定向?

我是用Kotlin编写代码的,所以这门语言的任何例子都很棒!

注:本问题由作者有意撰写和回答(自答问题),以便在so中分享有趣问题的解决方案。

共有1个答案

邹坚壁
2023-03-14

首先,最好是您的代理或负载平衡器可以为您执行此检查和重定向,因为它知道公共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