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 相关文章推荐
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
php实现的通用图片处理类
Mar 24 PHP
php判断当前操作系统类型
Oct 28 PHP
PHP内核探索之变量
Dec 22 PHP
php版微信公众号接口实现发红包的方法
Oct 14 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
彻底搞懂PHP 变量结构体
Oct 11 PHP
360搜索引擎自动收录php改写方案
Apr 28 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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中的cookie
2006/11/26 PHP
PHP strtr() 函数使用说明
2008/11/21 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
2011/11/02 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
javascript之querySelector和querySelectorAll使用说明
2011/10/09 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python中的__SLOTS__属性使用示例
2015/02/18 Python
使用graphics.py实现2048小游戏
2015/03/10 Python
详解python之简单主机批量管理工具
2017/01/27 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Python中格式化字符串的四种实现
2020/05/26 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
生日派对邀请函
2014/01/13 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
小学英语听课心得体会
2016/01/14 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL
vue ref如何获取子组件属性值
2022/03/31 Vue.js
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers