我有一个 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,内容还可以,但所有链接都以“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; }
Run Code Online (Sandbox Code Playgroud)
正在添加以下标题:
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
Run Code Online (Sandbox Code Playgroud)
...以便 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;
}
Run Code Online (Sandbox Code Playgroud)
看起来确实ForwardedHeaderFilter
考虑了标题X-Forwarded-Proto
。尽管仍然非常不清楚为什么执行器实现默认情况下不执行此操作(因为其他X-Forwarded
标头已得到正确处理)
归档时间: |
|
查看次数: |
414 次 |
最近记录: |