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 相关文章推荐
第十三节--对象串行化
Nov 16 PHP
php 数组使用详解 推荐
Jun 02 PHP
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
浅谈PHP中的
Apr 23 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 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图形jpgraph操作实例分析
2017/02/22 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
php生成微信红包数组的方法
2019/09/05 PHP
js获取div高度的代码
2008/08/09 Javascript
Prototype 学习 Prototype对象
2009/07/12 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
python类继承与子类实例初始化用法分析
2015/04/17 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
python用插值法绘制平滑曲线
2021/02/19 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
python调用其他文件函数或类的示例
2019/07/16 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
学生操行评语大全
2014/04/24 职场文书
诚信承诺书模板
2014/05/26 职场文书
娱乐节目策划方案
2014/06/10 职场文书
学校运动会通讯稿
2015/07/18 职场文书
初中数学教学反思范文
2016/02/17 职场文书
教师师德承诺书2016
2016/03/25 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏