Scala 将Akka HTTP重定向到HTTPS
目前我有一个适用于HTTP和HTTPS的API,但我需要它只路由到HTTPS,即使URL是使用HTTP调用的。例如,两者都在发挥作用:Scala 将Akka HTTP重定向到HTTPS,scala,https,akka-http,Scala,Https,Akka Http,目前我有一个适用于HTTP和HTTPS的API,但我需要它只路由到HTTPS,即使URL是使用HTTP调用的。例如,两者都在发挥作用: http://app1_0.cloud.example.net/getSomething https://app1_0.cloud.example.net/getSomething Akka文档中有关于为证书添加httpscontext的内容,但我不确定是否需要这样做,因为我已经有了HTTPS。这是调用它的路由的位置: Http().bindandhold(a
http://app1_0.cloud.example.net/getSomething
https://app1_0.cloud.example.net/getSomething
Akka文档中有关于为证书添加httpscontext
的内容,但我不确定是否需要这样做,因为我已经有了HTTPS。这是调用它的路由的位置:
Http().bindandhold(aliveResponse~路由、主机、端口)
主机
和端口
在application.conf
中定义
有没有办法只添加重定向或强制转换以确保它发送到HTTPS
路线示例:
def marketsRoute = {
pathPrefix("markets") {
pathEnd{
logRequestResult("Read markets", akka.event.Logging.InfoLevel) {
get {
implicit val timeout = Timeout(20, TimeUnit.SECONDS)
val sitesResp = WaitListDAO.getMarkets
complete(HttpResponse( entity = HttpEntity(MediaTypes.`application/json`, sitesResp.toJson.toString)))
}
}
}
}
}
}
我们来尝试一下答案:
def marketsRoute = {
scheme("http") {
extract(_.request.uri) { uri =>
redirect( uri.withScheme("https"),
StatusCodes.MovedPermanently
)
}
} ~
pathPrefix("markets") {
pathEnd{
logRequestResult("Read a waitlist enable markets", akka.event.Logging.InfoLevel) {
get {
implicit val timeout = Timeout(20, TimeUnit.SECONDS)
val sitesResp = WaitListDAO.getMarkets
complete(HttpResponse( entity = HttpEntity(MediaTypes.`application/json`, sitesResp.toJson.toString)))
}
}
}
}
}
}
除非HTTPS服务器也在同一个应用程序中被绑定和处理,否则您不需要定义
HttpsConnectionContext
HTTPS重定向的路由(摘自此相关文件)应如下所示:
val route =
scheme("http") {
extract(_.request.uri) { uri =>
redirect( uri.withScheme("https").withAuthority(hostName, portHttps),
StatusCodes.MovedPermanently
)
}
}
请注意,如果您使用的是标准HTTPS端口(即443),则不需要
.withAuthority()
。这是否回答了您的问题?不,我不这么认为。正如我在最初的问题中所说的,我不认为我需要答案所依赖的httpsContext。明白了,我只是添加了一条路线作为示例,所以我需要添加您在那里添加的内容?好吧,真的只需添加方案,然后在重定向后完成吗?@Kooky_Lukey,类似于链接博客文章中的示例代码,您可以使用tilde组合器(即~
)简单地链接其他路由/路径匹配器(如果有)。