如何在两个AWS Elastic Beanstalk服务器之间允许CORS跨域?
可能导致该问题的Elastic Beanstalk相关原因及排查方案
- CORS origin匹配规则问题
你当前配置的origin值末尾携带斜杠"https://www.petsource.app/",而浏览器发起跨域请求时携带的Origin请求头默认不带末尾斜杠(值为https://www.petsource.app),cors包默认采用严格相等匹配规则,会匹配失败导致CORS校验不通过。可修改配置为去掉末尾斜杠的版本,或是使用正则匹配兼容两种格式:
// 方案1:去掉末尾斜杠 app.use(cors({ origin: "https://www.petsource.app" })); // 方案2:正则兼容两种格式 app.use(cors({ origin: /^https:\/\/www\.petsource\.app\/?$/ }));
- EB反向代理覆盖/移除CORS响应头
Elastic Beanstalk的Node.js等托管运行时默认会前置Nginx作为反向代理,默认配置可能会抹除应用返回的自定义响应头,导致CORS头无法正常返回给浏览器。
排查方法:登录EB实例,直接向应用本地监听端口(通常为3000、8080等)发起curl请求查看响应头是否携带Access-Control-Allow-Origin,再向外网域名发起请求对比,如果公网请求没有对应头,需要新增Nginx自定义配置保留CORS相关响应头。 - 预检请求被EB链路拦截
非简单POST请求(比如携带application/json类型请求体、自定义请求头)会先触发OPTIONS类型的预检请求,Elastic Beanstalk链路的多个组件都可能拦截该请求:- 负载均衡(ALB)的监听器规则是否允许OPTIONS方法
- WAF规则是否拦截了OPTIONS请求
- 服务端代码如果没有默认处理OPTIONS请求,可以在cors配置后新增
app.options('*', cors())统一处理所有预检请求
- EB环境变量覆盖配置
如果你的CORS origin值是通过环境变量读取的,可登录EB控制台进入对应环境的「配置」-「软件」栏目,检查环境变量中配置的origin值是否和预期一致。
内容的提问来源于stack exchange,提问作者vincent
相关产品推荐
相关产品推荐

