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 相关文章推荐
第四节--构造函数和析构函数
Nov 16 PHP
PHP 5.0对象模型深度探索之对象复制
Mar 27 PHP
php 正则 过滤html 的超链接
Jun 02 PHP
php foreach 参数强制类型转换的问题
Dec 10 PHP
PHP stream_context_create()作用和用法分析
Mar 29 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
Jul 03 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 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中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
python处理图片之PIL模块简单使用方法
2015/05/11 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
JPA的特点
2014/10/25 面试题
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
应届生如何写自荐信
2014/01/05 职场文书
自主招生推荐信范文
2014/05/10 职场文书
2014年残联工作总结
2014/11/21 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
工程主管竞聘书
2015/09/15 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
我收到了德劲DE1107
2022/04/05 无线电