挨實際開發中遇到請求跨域的問題一般有兩種解決辦法:
1.如果接口是請求后台,那么在后台寫攔截器,攔截所有OPTIONS請求並返回200
2.如果接口是通過nginx去訪問后台,那么可以在nginx直接攔截
問題描述:
現在有一個提供給其他廠商的接口跨域,接口地址是nginx地址。
解決辦法:
在nginx location中加上配置如下:
1 if ($request_method = 'OPTIONS') { 2 add_header Access-Control-Allow-Origin '*'; 3 add_header Access-Control-Allow-Methods 'POST,OPTIONS,GET'; 4 add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; 5 add_header Access-Control-Allow-Credentials 'true'; 6 add_header Allow 'POST, OPTIONS'; 7 add_header Content-Type 'text/plain;charset=utf-8'; 8 return 200; 9 }
這樣加入配置,用chrome瀏覽器調試的時候發現,OPTIONS請求返回200,但是卻沒有POST請求,意味着OPTIONS請求有問題。打開火狐瀏覽器,調試工具發現OPTIONS報錯,報錯信息如下:
已攔截跨源請求:同源策略禁止讀取位於 http://ip:port/xxxxx/的遠程資源。(原因:CORS 頭缺少 'Access-Control-Allow-Origin')。
查閱資料后發現問題:
如果在指定Access-Control-Allow-Credentials 'true'后,就不能指定Access-Control-Allow-Origin為*,必須將其指定為具體的地址,修改如下:
1 if ($request_method = 'OPTIONS') { 2 add_header Access-Control-Allow-Origin $http_origin; 3 add_header Access-Control-Allow-Methods 'POST,OPTIONS,GET'; 4 add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; 5 add_header Access-Control-Allow-Credentials 'true'; 6 add_header Allow 'POST, OPTIONS'; 7 add_header Content-Type 'text/plain;charset=utf-8'; 8 return 200; 9 }