You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React客户端如何代理到SpringBoot服务端?部署Heroku报Invalid Header怎么解决

问题核心原因

你之前尝试的proxy配置、setupProxy.js都仅适用于本地开发阶段,由Create React App内置的开发服务器提供代理能力。当你执行npm run build部署到Heroku时,React项目会被编译为纯静态资源,不再有开发服务器提供代理能力,所以上述配置完全不生效。

可行解决方案

方案1:前后端分独立Heroku应用部署(适配你当前的架构)

  • 第一步:统一接口请求前缀,新增环境变量区分环境
    所有前端接口请求统一拼接环境变量,比如原有fetch('/api/auth')修改为:
    fetch(`${process.env.REACT_APP_API_URL}/api/auth`)
    

    注意:Create React App 要求自定义环境变量必须以REACT_APP_为前缀才会被识别。

  • 第二步:新增对应环境的变量配置文件
    在React项目根目录新建.env.development(本地开发生效),内容:
    REACT_APP_API_URL=
    
    空值代表本地开发时直接走相对路径,匹配你原有package.json的proxy配置,不影响本地调试。
    再新建.env.production(生产部署生效),内容替换为你后端的Heroku地址,注意要用https协议:
    REACT_APP_API_URL=https://my-server.herokuapp.com
    
  • 第三步:SpringBoot后端配置跨域
    在后端接口对应Controller类上添加@CrossOrigin注解,放行前端域名:
    @CrossOrigin(origins = "https://你的前端Heroku应用域名")
    @RestController
    @RequestMapping("/api")
    public class AuthController {
      // 接口逻辑
    }
    

部署前删除package.json中的proxy字段即可,避免生产环境不必要的配置冲突。

方案2:前后端合并部署到同一个Heroku应用

如果不想维护两个应用,可以把React编译后的静态资源集成到SpringBoot项目中统一部署,完全不需要代理配置:

  • 第一步:React项目执行npm run build,将生成的build目录下所有文件,复制到SpringBoot项目的src/main/resources/static目录中
  • 第二步:SpringBoot新增路由适配配置,避免前端路由刷新404:
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/{path:[^\\.]*}")
                    .setViewName("forward:/index.html");
        }
    }
    
  • 第三步:前端接口直接写相对路径/api/xxx即可,不需要额外加域名,前后端同域名不存在跨域和代理问题,直接打包SpringBoot的jar包部署即可。

内容的提问来源于stack exchange,提问作者Peter Kronenberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:54:03