方案一:直接在域名配置中增加*
Header set Access-Control-Allow-Origin *
缺点:安全性缺失。公交车,谁都能访问。相当于完全放弃跨域控制。
且无法发送登陆凭证,发送cookie等依然会被拦截
方案二:php中增加跨域设置
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : "*";
header('Access-Control-Allow-Origin:' . $origin);
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: Content-Type, X-Requested-With, Cache-Control,Authorization");
优点:可以根据白名单来开启是否跨域。发送cookie等凭证不会被拦截
缺点:文件等静态文件不经过php处理,依然会被跨域拦截
上述代码没有加白名单,需要的自己加
方案三:.htaccess中添加设置
SetEnvIf Origin "^http(s)?://(.+\.)?(submit.magazine.ubandev.com|localhost:8080)$" origin_is=$0
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is
Header set Access-Control-Allow-Credentials true
有点:无需修改apache域名配置。静态文件也可设置响应头,可以跨域。正则之后响应头只有一个域名,可以发送cookie
总结
推荐使用方案三,几乎完美解决跨域中遇到的所有问题。nginx或许可以使用反向代理解决,使用方案三的思路应该也可以。
网友评论