Spring Boot Cors在非默认端口上的反向代理后面

时间:2017-10-21 16:24:54

标签: spring docker nginx cors

我的应用程序有一个使用Spring Boot构建的后端,以及一个使用Angular构建并由nginx提供服务的前端Web应用程序。 Nginx配置为将请求反向代理到/ api /后端:

location /api/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://back:8080;
}

如果nginx在默认端口(80)上运行,我可以http://myserver/访问我的应用程序而不会出现问题。 XHR致电http://myserver/api/some/REST/resource完美无缺。

如果我更改nginx以侦听其他端口(随机:9043),则所有XHR调用都会失败并显示错误"无效的CORS请求"。这是意料之外的,因为只有我的前端应用程序正在调用API,并且由于反向代理,此API在与javascript文件相同的主机上提供。

要使其正常运行,我需要将其添加到我的Spring应用程序中:

@Configuration
public class CorsConfig {

    @Value("${url.base:''}")
    private String urlBase;

    @Value("${cors.allowed.origins:[]}")
    private String[] allowedOrigins;

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping(urlBase + "/**")
                        .allowedOrigins(allowedOrigins)
                        .allowedMethods("*");
            }
        };
    }
}

然后在我的配置中将cors.allowed.origin设置为http://myserver:9043/

这样可行,但如果我要去:

则不切实际
  • 使主机名和/或端口动态化(端口在CI构建期间从分支名称派生,然后将容器部署到rancher集群)
  • 隐藏负载均衡器后面的nginx(=另一级反向代理)

通过执行以下任何操作,是否有解决方案可以解决此问题:

  • 在验证CORS请求时,是否允许spring boot忽略端口号?
  • 让nginx调整代理请求的内容,以便Spring的CORS验证成功吗?

编辑:更多细节和示例:

服务已泊坞化:

  • 前端:nginx侦听容器内的端口80,docker在主机上将其暴露为端口9043
  • 后端:spring boot在8080上侦听。该端口不是由Docker导出的,因此只能从前端容器访问,该容器有一个指向后端容器的链接。

仅当前端在端口80上暴露于外部世界时才有效...

0 个答案:

没有答案