什麼是跨域請求?前端
當一個資源向與自己所在服務器不一樣的域或者端口發起請求時,會發起一個跨域HTTP請求。web
爲何有跨域限制?跨域
跨域資源共享(CORS即Cross Origin Resource Sharing)機制容許Web服務器進行跨域訪問控制,從而能夠安全地進行跨域訪問,覽器支持在 API 容器中使用 CORS,以下降跨域 HTTP 請求所帶來的風險。瀏覽器
簡單請求大體知足如下條件:安全
使用下列方法之一:服務器
GETcookie
HEADapp
POSTurl
HTTP頭不超過如下字段:spa
Accept
Accept-Language
Content-Language
DPR
Downlink
Save-Data
Viewport-Width
Width
其中Content-Type 只能爲如下之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded
如不知足以上條件,均可以視爲複雜請求。
進行簡單請求時,須要在服務端帶上Access-Control-Allow-Origin
的響應頭,以PHP爲例:
header('Access-Control-Allow-Origin:*']);
其中「 * 」表示該數據對任何人可見,若是隻但願特定的地址訪問,能夠把*改成對應的地址
複雜請求會先發送一個預請求,該請求以OPTIONS方法發起,預請求會對服務器進行檢測,以獲取服務器是否容許該請求,預請求能夠避免跨域請求對服務器產生的未知影響。
當進行復雜請求時須要對服務端進行設置,以PHP爲例:
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow- Methods: GET, POST, PUT,DELETE,OPTIONS,PATCH'); header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
其中Access-Control-Allow-Method
表示預請求後所容許的請求方式,Access-Control-Allow-Headers
表示預請求後所容許的響應頭,若是預請求成功,就能夠進行實際請求。
通常基於HTTP cookies的驗證身份對於跨域 XMLHttpRequest請求來講,瀏覽器並不會發送對應的身份憑證信息,若是須要帶上身份憑證的XMLHttpRequest請求,須要作額外的設置,以PHP爲例:
header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization"); header('Access-Control-Allow-Methods:GET,POST, PUT,DELETE,OPTIONS,PATCH');
前端則須要將withCredentials設置爲true,從而向服務器發送cookies,服務端則須要設置Access-Control-Allow-Credentials:true
來把響應內容返回請求者,因爲withCredentials:true
與Access-Control-Allow-Origin:*
不能同時存在,因此須要從$_SERVER
(PHP超級全局變量,包含由web服務器建立的信息,它提供了服務器和客戶配置及當前請求環境的有關信息。)獲取請求域的信息。