跨域问题常常须要面对,前端须要作的比较直接
要么选择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方式跨域提交一样适用前后端分离