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方式跨域提交一样适用前后端分离

相关文章
相关标签/搜索