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 相关文章推荐
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
php小偷相关截取函数备忘
Nov 28 PHP
应用开发中涉及到的css和php笔记分享
Aug 02 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
php加密解密字符串示例
Oct 13 PHP
laravel5使用freetds连接sql server的方法
Dec 07 PHP
在TP5数据库中四个字段实现无限分类的示例
Oct 18 PHP
tp5递归 无限级分类详解
Oct 18 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中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
PHP加密解密类实例分析
2015/04/20 PHP
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
详解Angular 中 ngOnInit 和 constructor 使用场景
2017/06/22 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
python使用RNN实现文本分类
2018/05/24 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
实习教师自我鉴定
2013/12/09 职场文书
毕业生就业自荐书
2013/12/15 职场文书
前台文员岗位职责
2013/12/28 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
租房协议书范文
2014/08/20 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
机关保密工作承诺书
2015/05/04 职场文书
海上钢琴师的观后感
2015/06/11 职场文书