nginx,上游,cors 失败

Posted

技术标签:

【中文标题】nginx,上游,cors 失败【英文标题】:nginx, upstream, cors fail 【发布时间】:2014-06-22 02:36:45 【问题描述】:

无法理解为什么我的上游/CORS 配置失败。这会阻止一些本地开发和测试。

local.mysite.com:8081 发出 API 请求时,我收到 请求的资源上没有“Access-Control-Allow-Origin”标头 strong> 到 events.mysite.com

这是我来自 /etc/nginx/sites-available/mysite 的服务器配置

# the IP(s) on which your node server is running. I chose port 3000.
upstream mysite 
    server 127.0.0.1:3000;


# the nginx server instance
server 
    listen 0.0.0.0:80;
    server_name mysite events.mysite.com;
    access_log /var/log/nginx/mysite.log;

    # pass the request to the node.js server with the correct headers and much more can be added, see nginx config options
    location / 
      proxy_set_header Access-Control-Allow-Origin *;
      # proxy_set_header 'Access-Control-Allow-Credentials' 'true';   # i've tried with and without this setting
      proxy_set_header 'Access-Control-Allow-Headers' 'X-Requested-With,Accept,Content-Type, Origin';
      proxy_set_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';

      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://app_mysite/;
      proxy_redirect off;
    
 

,我尝试在 Access-Control-* 选项上使用 add_header 而不是 proxy_set_header,但也没有骰子。

我正在运行一个 Node.js 应用程序。我没有修改 Node 代码来处理 CORS...是我的 nginx 配置错误,还是没问题,但我需要在 Node 中执行其他操作?

【问题讨论】:

【参考方案1】:

CORS 标头必须提供给浏览器,而不是您的节点应用程序。因此,您应该使用add_header 指令,或者更好的是,在您的应用程序中设置这些标头。这应该足够了。如果您确实使用withCredentials,请取消注释相应的行。如果您使用某些使浏览器发送预检请求的东西,您应该正确处理“OPTIONS”请求。

location / 
  add_header Access-Control-Allow-Origin *;
  # add_header Access-Control-Allow-Credentials true;

  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true;

  proxy_pass http://app_mysite/;
  proxy_redirect off;

【讨论】:

没有骰子——我在上面提到我也尝试过 add_header。我在我的应用程序中尝试了超级简单的标头修改,但我是 Node 新手,一定做错了。基本上我有这个:function start(route, handle) function onRequest(request, response) response.header("Access-Control-Allow-Origin", "*"); response.header("Access-Control-Allow-Headers", "X-Requested-With"); ... rest of server.js 看起来在本地主机上我现在收到一个失败的 OPTIONS 调用。净::ERR_CONNECTION_REFUSED 你如何请求这个网址? 终于明白了——感谢您的回复,您说得对,我的 Node.js 代码需要进行更改,但仍然存在问题。在设置标题的函数中,我将 Allow-Headers 更改为:response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

以上是关于nginx,上游,cors 失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx 作为反向代理和 keycloak 作为上游服务器的组合失败

nginx tomcat7 错误:-“从上游读取响应标头时,recv() 失败(104:对等连接重置)”

Nginx 错误失败(111:连接被拒绝)同时连接到上游,docker-compose nodejs

Nginx + Docker Compose-连接到上游时connect()失败(111:连接被拒绝)

Nginx 当上游服务器返回失败时的处理办法

cookie-cutter django nginx connect() 在连接到上游时失败(111:连接被拒绝),