Nginx 代理 Nodejs(Dokku)。CORS 响应标头未通过

Nginx 代理 Nodejs(Dokku)。CORS 响应标头未通过

我正在使用 Dokku 在 DigitalOcean 上托管我的应用程序。 多库运行 nginx 1.6 来代理模拟 Heroku 类环境的 Docker 应用。所有应用都共享类似的默认配置,如下所示。

我的 Node.js 服务器使用CORS 中间件告诉浏览器允许 www.myapp.com 调用 api.myapp.com:

这在我的本地计算机上运行良好。当我部署它时,我在浏览器中收到 CORS 错误:

XMLHttpRequest cannot load https://api.myapp.com/r_u_up. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.myapp.com' is therefore not allowed access. The response had HTTP status code 502.

所以,WTF,结束了。

我找到了这个nginx CORS 配置但它看起来非常糟糕。这是旧代码还是最佳方法? 插件使用该配置。

我更喜欢更简单的配置,只需传递响应标头即可。我的应用程序不需要 nginx 来拦截它们。我该如何配置?

应用程序nginx.conf的:

upstream www { server 172.17.0.135:5000; }
server {
  listen      [::]:80;
  listen      80;
  server_name www.myapp.com ;
  return 301 https://www.myapp.com$request_uri;
}

server {
  listen      [::]:443 ssl spdy;
  listen      443 ssl spdy;
  server_name www.myapp.com;


  keepalive_timeout   70;
  add_header          Alternate-Protocol  443:npn-spdy/2;
  location    / {
    proxy_pass  http://www;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
  include /home/dokku/www/nginx.conf.d/*.conf;
}

答案1

更新:事实证明 CORS 是一个僵尸化、行尸走肉式的疯狂规范,是的,使用 nginx 配置执行此操作是最好的方法。

http://enable-cors.org/

之所以选择 nginx 是最好的方式,是因为 nginx 是速度最快并且距离客户端最近的进程。

如果 nginx 可以在不触碰您的应用程序(node.js、php、rails 等)的情况下处理请求,那么您的应用程序将更容易扩展,并且运行速度更快。

相关内容