我有一个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
协议。
我怎样才能做到这一点?
答案 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()
。