代码里返回401状态码,前端没捕获到statusCode

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

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; 
         
    }

}

碰到的问题
在我最开始的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生效。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章