我有一个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,后者使用嵌入式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协议
答案 0 :(得分:1)
我通过在配置类中添加以下代码块来解决了这个问题:
@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
标头已得到正确处理)