如何使用akka-http

时间:2018-02-08 15:52:53

标签: scala akka-http

我有一个Scala应用在自定义端口上运行akka-http网络服务器,让我们说8000

直到不久前,它只处理http://次请求,但最近我切换到https://

有些客户将链接标记为书签并继续收到无连接错误,因为他们使用http://而不是https://来尝试地址,并且他们会忘记发生这种情况的原因。

我尝试将两个服务绑定到同一个端口但是失败了,因为只有第一个绑定了。

Http().bind(interface = "0.0.0.0", port = Global.settings.restPort, connectionContext = httpsContext)
Http().bind(interface = "0.0.0.0", port = Global.settings.restPort)

http://服务器所需要的只是返回301代码并重定向到同一地址,但使用https协议。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

正如其他人所评论的那样,您无法将HTTP和HTTPS服务器绑定到同一端口。您可以使用Akka-http scheme()redirect()将所有HTTP服

val hostName = "www.example.com"
val portHttp = 8080
val portHttps = 8443

val route =
  scheme("http") {
    extract(_.request.uri) { uri =>
      redirect( uri.withScheme("https").withAuthority(hostName, portHttps),
        StatusCodes.MovedPermanently
      )
    }
  } ~
  pathSingleSlash {
    get {
      complete( HttpEntity( ContentTypes.`text/html(UTF-8)`,
        "Welcome to Akka-HTTP!"
      ) )
    }
  }

Http().bindAndHandle(route, hostName, portHttp)
Http().bindAndHandle(route, hostName, portHttps, connectionContext = httpsContext)

请注意,如果您使用标准HTTP和HTTPS端口(即80和443),则无需应用withAuthority()