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

非默认端口上反向代理后的Spring Boot Cors,spring,docker,nginx,cors,Spring,Docker,Nginx,Cors,我的应用程序有一个用Spring Boot构建的后端,还有一个用Angular构建的前端web应用程序,由nginx提供服务。 Nginx配置为将代理请求反向发送到后端/api/: location /api/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://back:8080; } 如果nginx在默认端口(80)上运行,我可以在访问我的

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

location /api/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://back:8080;
}
如果nginx在默认端口(80)上运行,我可以在访问我的应用程序时不会出现问题。XHR调用可以完美地工作

如果我将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
s设置为
http://myserver:9043/
在我的配置中

这是可行的,但如果我要:

  • 使主机名和/或端口动态(端口在CI构建期间从分支名称派生,然后容器部署到rancher群集)
  • 将nginx隐藏在负载平衡器后面(=另一级反向代理)
是否有解决方案通过执行以下任一操作来解决此问题:

  • 让spring引导在验证CORS请求时忽略端口号
  • nginx是否调整了代理请求的内容,以便Spring验证CORS成功
编辑:更多详细信息和示例:

服务已停靠:

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

只有当前端在端口80上对外开放时,它才有效…

即使主机是相同的,正如您所看到的,如果前端和后端位于不同的端口上,您将需要CORS头。您是否尝试使用属性“server.address”映射端点?如果我没有错的话,如果你定义了你的端点,这将被cors使用,你将拥有它的端口。@lbndev?你解决了这个问题吗?我也遇到了类似的问题(这只发生在Chrome上,而不是Firefox上,很奇怪)@PabloLozano:没有:(最终,我在基础设施上解决了这个问题(使用traefik LB+通配符DNS),所以我总是使用端口80(或443)。但问题仍然有效且未解决。@lbndev我通过添加到代理配置
proxy\u set\u header Origin”“;
解决了这个问题。这个头似乎是Spring检查的(头不是Firefox添加的,这就是它工作的原因)