因爲項目是先後端分離,API接口與Web前端 部署在不一樣站點當中,所以在前文當中WebApi Ajax 跨域請求解決方法(CORS實現)使用跨域處理方式處理而不用Jsonp
的方式。html
可是在一段時間後,發現一個很奇怪的問題,每次前端發起請求的時候,經過瀏覽器的開發者工具都能看到在Network
下同一個url
有兩條請求,第一條請求的Method
爲OPTIONS
,第二條請求的Method
纔是真正的Get
或者Post
,而且,第一條請求無數據返回,第二條請求才返回正常的數據。前端
第一個OPTIONS
的請求是由WEB服務器處理跨域訪問引起的。OPTIONS
是一種預檢請求
,瀏覽器在處理跨域訪問的請求時,若是判斷請求爲複雜請求,則會先向服務器發送一條預檢請求,根據服務器返回的內容,瀏覽器判斷服務器是否容許訪問該請求。若是WEB服務器採用CORS
的方式支持跨域訪問,在處理複雜請求時這個預檢請求是不可避免的。nginx
因爲咱們的WEB服務器採用CORS
來解決跨域訪問的問題,同時在header
中添加了自定義參數以及使用json
格式來進行數據交互,致使咱們的每次請求都是複雜請求,從而產生每次請求都會發送兩條請求的現象。json
產生緣由以下:c#
CORS
解決跨域問題Nginx
當中,經過代理的方式來解決跨域請求問題Windows 下 安裝 Nginx 最簡單,直接下載壓縮包,而後解壓後後端
已自帶默認配置,如要部署Vue
、Angular
這種單頁面應用,將打包後的index.html
文件以及dist
目錄放到發佈目錄中,將路徑複製,用於配置Nginx
服務指向api
配置文件以下:跨域
server { listen 9461; # 監聽端口號 server_name localhost 192.168.88.22; # 訪問地址 location / { root 項目路徑; # 例如:E:/Publish/xxx/; index index.html; # 此處用於處理 Vue、Angular、React 使用H5 的 History時 重寫的問題 if (!-e $request_filename) { rewrite ^(.*) /index.html last; break; } } # 代理服務端接口 location /api { proxy_pass http://localhost:9460/api;# 代理接口地址 } }
Nginx
中URL重寫的時候,一直報錯以下if
和 (
之間必須有個空格。能夠在服務端處預檢完成後加入一個Access-Control-Max-Age
請求頭來解決這個問題。瀏覽器
Access-Control-Request-Headers
字段,則Access-Control-Allow-Headers
字段是必需的。Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header Access-Control-Allow-Credentials: true Access-Control-Max-Age: 1728000