因此,似乎 Google Cloud Load Balancer 发送了错误的标头,或者 Ktor 读取了错误的标头,或者两者兼而有之。
我试过了
install(ForwardedHeaderSupport)
install(XForwardedHeaderSupport)
install(HttpsRedirect)
或者
//install(ForwardedHeaderSupport)
install(XForwardedHeaderSupport)
install(HttpsRedirect)
或者
install(ForwardedHeaderSupport)
//install(XForwardedHeaderSupport)
install(HttpsRedirect)
或者
//install(ForwardedHeaderSupport)
//install(XForwardedHeaderSupport)
install(HttpsRedirect)
所有这些组合都在另一个项目上工作,但该项目使用的是旧版本的 Ktor(这是随 1.4 rc 发布的那个),并且该项目还使用旧的 Google Cloud 负载平衡器设置。
所以我决定自己动手。此行将记录您的请求中的所有标头,
log.info(context.request.headers.toMap().toString())
然后只需选择相关的并构建一个 https 重定向:
routing {
intercept(ApplicationCallPipeline.Features) {
if (ENV.env != LOCAL) {
log.info(context.request.headers.toMap().toString())
// workaround for call.request.host that contains the wrong host
// and not redirecting properly to the correct https url
val proto = call.request.header("X-Forwarded-Proto")
val host = call.request.header("Host")
val path = call.request.path()
if (host == null || proto == null) {
log.error("Unknown host / port")
} else if (proto == "http") {
val newUrl = "https://$host$path"
log.info("https redirecting to $newUrl")
// redirect browser
this.context.respondRedirect(url = newUrl, permanent = true)
this.finish()
}
}
}