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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
php 表单数据的获取代码
Mar 10 PHP
php数组函数序列之array_keys() - 获取数组键名
Oct 30 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
php实现遍历文件夹的方法汇总
Mar 02 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 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编程实现获取excel文档内容的代码实例
2011/06/28 PHP
PHP设计模式 注册表模式
2012/02/05 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
python实现微信自动回复机器人功能
2019/07/11 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
JDK安装目录下有哪些内容
2014/08/25 面试题
什么是SCM(软件配置管理)
2014/08/16 面试题
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
留学推荐信怎么写
2014/01/25 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
二胎满月酒致辞
2015/07/29 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
css3中transform属性实现的4种功能
2021/08/07 HTML / CSS
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电