ThinkPHP 5.1 跨域配置方法


Posted in PHP onOctober 11, 2019

因为最近的项目采用了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 以及受访问的控制器文件头部均出现以下报错信息:

Failed to load http://url.com/main/info: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'null' is therefore not allowed access.The response had HTTP status code 404.

说明配置并没有生效。

查阅 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') ,再次请求出现了下面的报错:

Failed to load: http://url.com/main/info: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response.

header 的配置没有生效。

解决办法:将 header('Access-Control-Allow-Headers: content-type,token'); 添加到 入口文件 /public/index.php 即可。

以上这篇ThinkPHP 5.1 跨域配置方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP 强制性文件下载功能的函数代码(任意文件格式)
May 26 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
php购物车实现代码
Oct 10 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
浅谈ThinkPHP的URL重写
Nov 25 PHP
给ECShop添加最新评论
Jan 07 PHP
php遍历解析xml字符串的方法
May 05 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
php 微信开发获取用户信息如何实现
Dec 13 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
PHP实现考试倒计时功能代码
Apr 16 PHP
零基础php编程好学吗
Oct 11 #PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 #PHP
PHP与SQL语句写一句话木马总结
Oct 11 #PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 #PHP
php生成HTML文件的类方法
Oct 11 #PHP
php报错502badgateway解决方法
Oct 11 #PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 #PHP
You might like
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
php生成静态页面的简单示例
2014/04/17 PHP
php生成随机数的三种方法
2014/09/10 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
符合W3C网页标准的iframe标签的使用方法
2007/07/19 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
原生JavaScript编写俄罗斯方块
2015/03/30 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
[05:06]DOTA2-DPC中国联赛 正赛 VG vs Magma选手采访
2021/03/11 DOTA
Python列表删除的三种方法代码分享
2017/10/31 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Python如何读取文件中图片格式
2020/01/13 Python
python 实现Harris角点检测算法
2020/12/11 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
语文教育专业应届生求职信
2013/11/23 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
商业计划书之服装
2019/09/09 职场文书
Python基础之元类详解
2021/04/29 Python