Spring Boot 执行器页面返回 http 链接而不是 https



我有一个Spring Boot 2.0.2应用程序。当我浏览到以下 URL: https://my-domain-name/my-application-name/actuator 时,我得到以下输出:

{
"_links": {
"self": {
"href": "http://my-domain-name/my-application-name/actuator",
"templated": false
},
"health": {
"href": "http://my-domain-name/my-application-name/actuator/health",
"templated": false
},
"info": {
"href": "http://my-domain-name/my-application-name/actuator/info",
"templated": false
}
}
}

如您所见,内容正常,但所有链接都以"http"开头,而不是以https开头。不过,我正在使用HTTPS访问URL。

我尝试访问的域名是 AWS Route 53 记录,其别名为 AWS ELB。此 ELB 将调用重定向到作为 K8S 集群的目标。pod本身正在运行Nginx,它将URL重定向到另一个pod,该pod使用嵌入式Tomcat运行Spring Boot,并使用HTTP和端口8080提供其内容。

对于Nginx,有一个代理通行证配置:

location /my-application-name { proxy_pass http://my-application-name; }

正在添加以下标头:

proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;

。这样 Spring Boot 就会知道"原始"请求。

有人知道我做错了什么吗?似乎执行器实现没有考虑到HTTPS协议

我通过在配置类中添加此代码块来解决此问题:

@Bean
public FilterRegistrationBean forwardedHeaderFilterRegistration() {
ForwardedHeaderFilter filter = new ForwardedHeaderFilter();
FilterRegistrationBean<ForwardedHeaderFilter> registration = new FilterRegistrationBean<>(filter);
registration.setName("forwardedHeaderFilter");
registration.setOrder(10000);
return registration;
}

似乎ForwardedHeaderFilter确实考虑了X-Forwarded-Proto标题。尽管目前还不清楚为什么执行器实现默认情况下不这样做(因为其他X-Forwarded标头正在正确处理(

最新更新