nginx 配置跨域失效修復

nginx 配置跨域不生效 以下配置

server {
        listen       80;
        server_name  localhost;
        
        # 接口轉發
        location /api/ {
            # 容許請求地址跨域 * 作爲通配符
            add_header 'Access-Control-Allow-Origin' '*';
            # 設置請求方法跨域
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
            # 設置是否容許 cookie 傳輸
            add_header 'Access-Control-Allow-Credentials' 'true';
            # 設置請求頭 這裏爲何不設置通配符 * 由於不支持
            add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';
            # 設置反向代理 
            proxy_pass 127.0.0.1:8081/;
        }
 }
  • 網上的 nginx 跨域配置主要是以上版本,然而不少都是抄一抄,並無真的去實踐,故寫了下文章提醒下有須要的人,不要盲目抄,學會分析。

nginx 修改以下配置後生效

server {
        listen       80;
        server_name  localhost;
        
        # 接口轉發
        location /api/ {
            # 容許請求地址跨域 * 作爲通配符
            add_header 'Access-Control-Allow-Origin' '*';
            # 設置請求方法跨域
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
            # 設置是否容許 cookie 傳輸
            add_header 'Access-Control-Allow-Credentials' 'true';
            # 設置請求頭 這裏爲何不設置通配符 * 由於不支持
            add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';
            
            # 設置 options 請求處理
            if ( $request_method = 'OPTIONS' ) { 
                return 200;
            }
            # 設置反向代理 
            proxy_pass 127.0.0.1:8081/;
        }
    }

二者代碼區別 主要就是下面這行代碼java

if ( $request_method = 'OPTIONS' ) { 
     return 200;
}

由於 post 請求 瀏覽器會發送一個 options 的預檢請求,主要將本次的請求頭 發送給服務端,若服務端容許,再發送真正的post請求,因此 f12 看到,常常 post 會發送兩次請求。由於後端 java 代碼沒有對 options 請求作出處理,致使 options 接口請求的時候,報 403 forbidden , 這裏 nginx 對 options 的請求直接返回 200,不用到達接口層,直接容許 post 響應頭,便可使得上述失效配置可以生效nginx


附贈 一個小知識點

  • proxy_pass 127.0.0.1:8081/;

針對反向代理裏面這個/ 加不加的問題;後端

訪問 http://localhost/api/user/login;api

  • / 則 實際訪問的是 127.0.0.1:8081/user/login;
  • 不加 / 則實際訪問的是 127.0.0.1:8081/api/user/login;

加了斜槓意味着全部的 /api 請求都會轉發到根目錄下,也就是說 /api 會被 / 替代,這個時候接口路徑就變了,少了一層 /api 。而不加斜槓的時候呢?這表明着轉發到127.0.0.1:8081的域名下, /api 的路徑不會丟失跨域

相關文章
相關標籤/搜索