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学习笔记之 函数声明
Jun 09 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
php 数据结构之链表队列
2017/10/17 PHP
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
python使用pymysql实现操作mysql
2016/09/13 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
应用数学自荐书范文
2013/11/24 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
财务会计专业求职信
2014/06/09 职场文书
公务员培的训心得体会
2014/09/01 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
清洁工个人总结
2015/03/04 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
JavaScript实现音乐播放器
2022/08/14 Javascript