gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:00:44 25 4
gpt4 key购买 nike

我的应用程序有一个使用 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 上暴露给外界时才有效......

    最佳答案

    在反向请求中添加两个 http header :
    X-Forwarded-Proto
    X 转发端口
    指示原始原型(prototype)和端口(匹配原始请求)。
    查看更多:https://moi.vonos.net/java/spring-forward/

    关于非默认端口上的反向代理背后的 Spring Boot Cors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46865387/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com