非默认端口上反向代理后的Spring Boot Cors
我的应用程序有一个用Spring Boot构建的后端,还有一个用Angular构建的前端web应用程序,由nginx提供服务。 Nginx配置为将代理请求反向发送到后端/api/:非默认端口上反向代理后的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)上运行,我可以在访问我的
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添加的,这就是它工作的原因)