跨域
-
前面有篇文章laravel跨域请求,说的是laravel项目中不用域名间的跨域问题,在laravel路由文件或者中间件中如下设置
// 设置允许跨域
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE');
header('Access-Control-Allow-Headers:Origin, Content-Type, Cookie, Accept');
header('Access-Control-Allow-Credentials:true');
并且在csrf的中间件文件中忽略你要请求的路由
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'/api/*'
];
}
就OK了
但是今天有需要是跨域访问另外一个项目的接口。仍然按照如下设置之后,得到的结果是这样的
这个字面意思是 请求头中的X-CSRF_TOKEN不被Access-Allow-Headers 允许,
那这是个啥玩意儿呢,猜想是之前的ajax请求设置了这个请求头,所以本次请求也携带了,验验证一下,我把这个请求放在了所有js文件的最上面,结果能成功请求。所以确实是请求头中的设置对现在造成了影响,那么怎样解决呢?
首先第一反应是去百度ajax清除请求头的方法,并没有找到,由于自己入行尚短,对http请求不是太理解,所以也踩了一些坑。我就对比两次请求的请求头,发现了一些问题。
看到这个Access-Control-Request-Headers:x-csrf-token,突然想到自己在服务器端设置过的允许跨域的内容
header('Access-Control-Allow-Headers:Origin, Content-Type, Cookie, Accept');
恍然大悟,服务器端定义了允许跨域访问的请求头,对应的应该是这一部分内容
于是,我加上了他说不被允许的这个X-CSRF-TOKEN
// 设置允许跨域
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE');
header('Access-Control-Allow-Headers:Origin, Content-Type, Cookie, Accept, X-CSRF-TOKEN');
header('Access-Control-Allow-Credentials:true');
就OK了。总结,入行也半年了,但是迟迟对http没有认真的学习了解过。
本作品采用《CC 协议》,转载必须注明作者和本文链接
012. 解决跨域问题( CORS )——barryvdh/laravel-cors