NodeJS 或 Nginx 上发生 Access-Control-Allow-Origin cors 错误

Posted

技术标签:

【中文标题】NodeJS 或 Nginx 上发生 Access-Control-Allow-Origin cors 错误【英文标题】:Access-Control-Allow-Origin cors error happening on NodeJS or Nginx 【发布时间】:2020-06-03 22:24:55 【问题描述】:

首先,我在写完问题后对这个主题进行了研究,有很多类似的问题,但我认为这里的问题有所不同:

No 'Access-Control-Allow-Origin' - Node / Apache Port Issue

当我们发送大量请求时,我们会收到此Access-Control-Allow-Origin cors 错误

从 'https://backend.*****.es/xxxxxx' 访问 XMLHttpRequest 来源 'https://www.testing.*******.es' 已被 CORS 阻止 政策:没有“Access-Control-Allow-Origin”标头出现在 请求的资源

请求的其余部分工作正常,我尝试设置:

app.use((req, res, next) => 
  res.header('Access-Control-Allow-Origin', '*');
  next();
);

但我遇到了同样的错误

我开始认为它可能与nginx有关。

这是我们正在使用的架构:

NodeJs、Expressjs

中间件:

常量限制 = '100mb'; 常量全局 = () => [ 摩根中间件(), 压缩(), cors(), bodyParser.urlencoded(extended: true, limit: LIMIT ), bodyParser.json( limit: LIMIT ), 头盔(), ];

服务器:Nginx 12.14.1

AWS Elastic BeanStalk

中的主机

如果有人知道会发生什么,请告诉我,因为我不知道它是来自我们的 nodejs 服务器还是 nginx。我们已经测试了许多解决方案,并且仍在检查其他选项。

【问题讨论】:

响应的 HTTP 状态码是什么?您可以使用浏览器开发工具中的网络窗格进行检查。是 4xx 还是 5xx 错误而不是 200 OK 成功响应? 我没有得到任何回应。 【参考方案1】:

在您的 Elastic Beanstalk 仪表板上找到 Amazon Linux 2 (AL2) 的类型:

从你的应用的根目录创建如下目录结构:

.platform/nginx/conf.d/

创建以下文件:

.platform/nginx/conf.d/01_custom_ngix.conf

添加 client_max_body_size 并在您创建的 01_custom_ngix.conf 文件中更改以下值(这里的示例是 1000M = 1GB)并确保您的 AWS Instance Types 足够大 t2.medium:

client_max_body_size 1000M;
client_body_buffer_size 100M;
...    
...    
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;

Git 提交您的更改。

部署您的代码:

> eb deploy 

选项:eb deploy --verbose --debug

【讨论】:

【参考方案2】:

我们的服务器出现此错误:

2020/02/20 10:56:00 [错误] 2784#0: *127 客户端也打算发送 大正文:4487648 字节,客户端:172.31.3.222,服务器:,请求: "PUT /cars/drafts/f7124841-f72c-4133-b49e-d9f709b4cf4d HTTP/1.1", 主机:“backend.xxxxx.es”,推荐人: "https://www.testing.xxxx.es/sellcar/photos/f7124841-f72c-4133-b49e-d9f709b4cf4d"

所以除了前面出现的错误是Access-Control-Allow-Origin之外,它与NGINX中设置的a限制有关。

现在我们只需要弄清楚如何访问我们的弹性 beanstalk 实例来更改这些变量,这已经解决了。

SSH to Elastic Beanstalk instance

要解决这个问题,请在 .ebextensions 中创建一个文件 x.config 并使用下一个 yaml 文件更改此变量:

files:
  "/etc/nginx/conf.d/01-client_max_body_size.conf":
    mode: 000644
    owner: root
    group: root
    content: |
      # MODIFIED VARIABLES ADDED BY 01-client_max_body_size.conf
      client_max_body_size 12m;
      client_body_buffer_size 16k;
container_commands:
  nginx_reload:
    command: sudo service nginx reload

然后重新部署您的环境。

非常感谢大家的帮助!

【讨论】:

以上是关于NodeJS 或 Nginx 上发生 Access-Control-Allow-Origin cors 错误的主要内容,如果未能解决你的问题,请参考以下文章

Cors nginx 和 nodejs

NodeJs:fs.stat() 或 fs.access() 检查文件夹是不是存在?

Nginx后缺少响应标头[关闭]

AWS EB + Nginx,更新 access.log 格式或创建新日志

单击错误:“Microsoft Access 与 OLE 服务器或 ActiveX 控件通信时发生”

基于nodejs打包部署vue项目