ThinkPHP 5.1 跨域配置方法
因为最近的项目采用了API接口开发方式,后端需要配置跨域的规则以便前端能够访问。
系统采用的框架为ThinkPHP,版本5.1.19
关于OPTIONS请求
由于前端的知识不是很熟悉,查阅了网上的资料得知,OPTIONS请求是在AJAX发送请求前发送的一个验证请求,该请求会验证一系列规则,若符合规则则会发送实际的GET或POST请求,跨域的规则也是OPTIONS请求时进行验证的。
遇到的问题
按照网上大部分关于跨域请求的配置,基本都是以下三行代码:
header("Access-Control-Allow-Origin:*"); header("Access-Control-Allow-Headers:Origin,X-Requested-With,Content-Type,Accept,Authorization"); header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS,PATCH');
把这三行代码放到/route/route.php,/route/api.php,/public/index.php以及受访问的控制器文件头部均出现以下报错信息:
Failedtoloadhttp://url.com/main/info:Responsetopreflightrequestdoesn'tpassaccesscontrolcheck:No'Access-Control-Allow-Origin'headerispresentontherequestedresource.Origin'null'isthereforenotallowedaccess.TheresponsehadHTTPstatuscode404.
说明配置并没有生效。
查阅ThinkPHP的文档,文档给出的例子:
Route::get('new/:id','News/read') ->ext('html') ->allowCrossDomain();
意思是只需要在路由的尾部添加allowCrossDomain()即可,所以我在每个需要进行跨域访问的路由后都添加了->allowCrossDomain(),问题得以解决。
另外的问题
由于前端的AJAX请求通常需要携带token验证,所以还需要将token添加到Access-Control-Allow-Headers
文档的例子是
Route::get('new/:id','News/read') ->ext('html') ->header('Access-Control-Allow-Origin','thinkphp.cn') ->header('Access-Control-Allow-Credentials','true') ->allowCrossDomain();
我按照上面的方法添加了->header('Access-Control-Allow-Headers','token'),再次请求出现了下面的报错:
Failedtoload:http://url.com/main/info:RequestheaderfieldtokenisnotallowedbyAccess-Control-Allow-Headersinpreflightresponse.
header的配置没有生效。
解决办法:将header('Access-Control-Allow-Headers:content-type,token');添加到入口文件/public/index.php即可。
以上这篇ThinkPHP5.1跨域配置方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。