nginx反向代理并配置SSL后,在Springboot中获取请求路径的问题

今天使用nginx对项目进行反向代理并设置了SSL访问。如下图
image.png
image.png

反向代理和SSL访问目前没有什么问题。

但我在SpringBoot中使用

httpRequest.getRequestURL().toString()

来获取用户请求地址。获取到的地址都是http开头的。

假设用户访问https://xxx.xxx.com,我在代码中只能获取http://xxx.xxx.com

请问有什么办法可以获取到https的吗?网上大部分教程是修改tomcat配置,但目前我使用的是内嵌tomcat,不知道该如何修改

阅读 4.7k
2 个回答

问题已经解决了。SpringBoot可以使用配置来修改Tomcat。

SpringBoot 1.5.x和2.x 版本的方法不一致,我这里是2.x的解决办法

@Configuration
public class TomcatConfig {
    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        // 新建一个RemoteIpValve
        RemoteIpValve remoteIpValve = new RemoteIpValve();
        // 下面这里的值要与nginx的header头对应
        remoteIpValve.setRemoteIpHeader("x-forwarded-for");
        remoteIpValve.setProtocolHeader("x-forwarded-proto");
        remoteIpValve.setProtocolHeaderHttpsValue("https");
        // 为tomcat新增一个valve
        tomcat.addEngineValves(remoteIpValve);
        return tomcat;
    }
}

你代理到 后端使用的是 http 协议

http_pass http://127.0.0.1:9000/

你可以添加个 header 头, 后端处理下,

            proxy_set_header X-Proto SSL;
            proxy_set_header X-Forwarded-Proto https;`

或着, 你直接给 127.0.0.1:9000 绑定SSL

http_pass https://127.0.0.1:9000/
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏