Nginx 配置 cros 跨域以及遇到 401 响应的问题

nginx配置cros跨域以及遇到401、500响应的问题

这是我Nginx的server配置:

 server {
  listen     80;
  server_name DataAnalysis;
 ​
  location / {
  if ($request_method = 'OPTIONS'){
  add_header 'Access-Control-Allow-Origin' '';
  add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
  add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
  return 204;
  }
  if ($request_method = 'POST') {
  add_header 'Access-Control-Allow-Origin' '
' always;
  add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
  add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
  add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
  }
  if ($request_method = 'GET') {
  add_header 'Access-Control-Allow-Origin' '*' always;
  add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
  add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
  add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always;
  }
  proxy_pass http://127.0.0.1:8080;

  }
 ​
 }
 ​

这里对配置的意思是:

对于接受到的所有请求进行判断,因为前端会发送有权限验证的请求会附加Authorization请求头,所以会出现CROS的非简单请求。于是对于OPTIONS试探请求,由Nginx直接添加所有Access-Control的响应头并return 204。所以所有的OPTIONS,是不会被交给我8080端口的服务的,直接由nginx处理。

而post和get请求,会由nginx转发到8080端口进行处理,并返回响应。

碰到的问题

在我最开始的nginx配置中,我的跨域可以正常使用,但是一旦server报错,出现500错误,浏览器会显示跨域错误,这里我并没有深究,只是改正了server出现500的错误,当正常响应状态码为200时,浏览器并不会有跨域失败的错误。

但是在处理带token的权限验证请求时,我的设想是收到401状态码时跳转回登录页,但我发现当权限验证不通过,也就是返回401状态码时,会出现跨域错误问题,导致我的ajax被浏览器同源策略限制,无法读取到任何error信息,该ajax几乎是没有发送的(其实已经发送并且服务器做出了响应,只是因为同源策略问题,被浏览器拦截,从而无法得到任何信息),虽然我可以在浏览器控制台清楚的看到返回了401的响应,但是因为同源策略限制,我就是无法在ajax回调中获取到该状态码。

在排查很久后才想到,之前所有非200、300的状态码响应,都会出现跨域报错问题,于是打开控制台一看,才发现是没有Access-Control这样的响应头!!!(明明出现之前跨域错误就应该想到的,结果折腾了这么久才想到要去检查响应头!!!!!!!!!)

原因和解决办法

原因其实很简单,是因为在nginx转发server响应的过程中,add_header只有在200,201,204,206,301,302,303,304,307状态码时会添加,而401、500,都没有添加。

解决:看上面的配置,在add_header最后加上always,可以让nginx在非200、300的状态码后面,也使得add_header生效。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!