我正在使用 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 配置执行此操作是最好的方法。
之所以选择 nginx 是最好的方式,是因为 nginx 是速度最快并且距离客户端最近的进程。
如果 nginx 可以在不触碰您的应用程序(node.js、php、rails 等)的情况下处理请求,那么您的应用程序将更容易扩展,并且运行速度更快。