Skip to main content
 首页 » 编程设计

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

2024年08月15日7lonelyxmas

我有一个 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 重定向到另一个运行 Spring Boot 并嵌入 Tomcat 的 Pod,并使用 HTTP 和端口 8080 提供其内容。

对于 Nginx,有一个代理传递配置:

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

正在添加以下 header :

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

...以便 Spring Boot 知道“原始”请求。

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

请您参考如下方法:

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

@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 header 。尽管目前还不清楚为什么执行器实现默认情况下不执行此操作(因为其他 X-Forwarded header 已得到正确处理)