当前位置: 首页 > 知识库问答 >
问题:

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

袁炳
2023-03-14

我的应用程序有一个使用 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;
}

如果ngin x在默认端口(80)上运行,我可以通过超文本传输协议://myserver/访问我的应用程序,没有问题。XHR调用超文本传输协议://myserver/api/一些/REST/资源可以完美工作。

如果我将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.origins为超文本传输协议://myserver: 9043/

这是可行的,但它是不切实际的,如果我要:

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

是否有通过执行以下任一操作来解决此问题的解决方案:

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

编辑:更多细节和示例:

这些服务是有记录的:

    < li >前端:nginx监听容器内的端口80,docker在主机上将其公开为端口9043 < li >后端:spring boot监听8080。该端口不是由Docker导出的,所以只能从前端容器访问,前端容器有一个到后端容器的链接。

只有当前端在端口80上暴露于外部世界时,它才有效。。。

共有1个答案

姜泳
2023-03-14

在反向请求中添加两个超文本传输协议头:

x-转发-原型

X 转发端口

标明始发协议和端口(符合始发要求)。

查看更多:https://moi.vonos.net/java/spring-forward/

 类似资料:
  • 我需要创建一个将请求从端口a代理到端口B的应用程序。例如,如果用户在端口3000上连接,他将被路由到端口3001,因此“原始”应用程序将在端口3001上运行,但在客户机(浏览器)中,用户将把端口3000。不是重定向... http://example.com:3000/foo/bar 将创建一个监听端口3001的新服务器,所有的调用实际上都是对端口3000的调用,该端口与新服务器和新端口一起运行。

  • 我在服务器上安装了keycloak standanlone,并尝试通过Nginx在反向代理后面使用它。Keycloak绑定到127.0.0.1

  • 我当前正在尝试用eureka设置服务发现,但客户端注册的端口错误。每个Eureka客户机都在自己的nginx反向代理后面的不同服务器上,并且可以通过端口443上的https从外部访问,但是java Eureka客户机配置在不同的端口上。我还尝试在nginx公开的相同端口上配置它们,但nginx服务器进行了无限重定向,并在一些尝试后以错误“无效重定向”停止。eureka客户端在不同的端口上注册,使用

  • Nginx 最强大的地方是在于其 HTTP 请求的反向代理,也即常说的七层反向代理。在这一层代理中,通过 Nginx 框架提供的相关配置,我们能在该层将发送过来的 http 协议转换成各种其他的协议比如 fastcgi 协议、uwsgi协议、grpc、http(高版本协议)、websocket协议等。这样使用 Nginx 框架,我们可以支持多种应用服务(java web、python web等)的

  • 我正试图将一个war文件(Oracle的APEX Listener)部署到部署在RHEL服务器上的Glassfish3.1.2.2服务器上(我也在家里的Ubuntu服务器上看到了同样的问题)。 我使用以下命令创建域: $GLASSFISH_HOME/bin/asadmin创建域--portbase 8100 myDomain [我还在同一台GlassFish服务器上创建多个域(一个GF实例有多个域

  • 我在谷歌上冲浪,没有找到任何具体的答案或例子,所以再次尝试我的运气在这里(经常是幸运的)。 问题所在 > 我在apache反向代理后面运行了一个spring boot RESTful服务。此RESTful服务只运行HTTP。假设它运行在本地IP172.S端口8080上。 我还配置了一个apache反向代理。假设它运行在本地IP172.a和公共IP55.a上。该代理响应两个端口80,但所有HTTP通