代碼裏返回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生效。
 

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