php後端控制可跨域的域名,容許圖片跨域上傳

跨域問題常常須要面對,前端須要作的比較直接
要麼選擇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方式跨域提交一樣適用前後端分離

相關文章
相關標籤/搜索