跨域問題常常須要面對,前端須要作的比較直接
要麼選擇ajax異步提交,XML或者jsonp,要麼表單提交php
jsonp基本能夠搞定大部分跨域問題,但問題也比較明顯,只能經過get方式提交
而且jsonp是經過把參數拼到URL上提交請求的
可是全部瀏覽器有URL長度限制,不一樣瀏覽器長度限制不同
當出現要提交大段落內容的時候,好比說文章,用jsonp的話超出長度只能分割提交
很麻煩,並且說到底對安全性有些影響
並且axiox如今也不支持jsonp了,雖然有方式解決前端
尤爲是圖片類的資源上傳,沒法很好的用jsonp之類的方法實現ajax
須要圖片上傳跨域的場景
固然能夠不跨域最好不跨域,可是目前大部分項目都已經先後端分離了
靜態資源和接口分別是不一樣的域名或者二級域名,這樣就涉及到了跨域
若是是資源上傳,跨域的時候須要後端Access-Control-Allow-Origin和當前請求的Origin同樣,不能設置爲*json
php解決方法
若是是傳統數據請求,那後端直接將Access-Control-Allow-Origin設置爲*就好後端
header('Access-Control-Allow-Origin:*');
但圖片之類的資源上傳Origin須要跟Access-Control-Allow-Origin的值同樣
若是設置Access-Control-Allow-Origin跟當前的Origin同樣的話就限制死了能上傳的域名只有一個
要有其餘域名須要調用這個接口的話就會被禁止跨域
因此最好的方法就是限定可以調用這個接口的域名列表,也提升了必定的安全性瀏覽器
作法就是先獲取當前請求的Origin,若是在容許訪問的域名列表裏
就將Access-Control-Allow-Origin的值設置爲當前請求的Origin安全
$originList = [ 'http://127.0.0.1', 'http://www.linkvall.cn', 'http://mobile.linkvall.cn', ]; if(in_array($_SERVER['HTTP_ORIGIN'], $originList)){ header('Access-Control-Allow-Origin:'.$_SERVER['HTTP_ORIGIN']); header("Access-Control-Allow-Credentials: true"); header('Access-Control-Allow-Headers:x-requested-with,content-type'); header("Access-Control-Allow-Methods: POST,GET,OPTIONS"); }
這樣就能控制能夠跨域的域名了,圖片類資源就能像同域同樣開心的上傳上來了
post方式跨域提交一樣適用前後端分離