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 相关文章推荐
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
php递归创建和删除文件夹的代码小结
Apr 13 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
解析MySql与Java的时间类型
Jun 22 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
Aug 20 PHP
php使用Jpgraph绘制饼状图的方法
Jun 10 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
php 二维数组时间排序实现代码
Nov 19 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 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
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
js DataSet数据源处理代码
2010/03/29 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
Vuex简单入门
2017/04/19 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
python3爬虫之设计签名小程序
2018/06/19 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
python 监控logcat关键字功能
2020/09/04 Python
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
实习单位推荐信范文
2013/11/27 职场文书
工作自荐信
2013/12/11 职场文书
特岗教师个人总结
2015/02/10 职场文书
寒假生活随笔
2015/08/15 职场文书
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL