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 中英文语言转换类
Sep 07 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
php采集文章中的图片获取替换到本地(实现代码)
Jul 08 PHP
PHP中使用memcache存储session的三种配置方法
Apr 05 PHP
destoon安全设置中需要设置可写权限的目录及文件
Jun 21 PHP
PHP的关于变量和日期处理的一些面试题目整理
Aug 10 PHP
全面解读PHP的人气开发框架Laravel
Oct 15 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
简单谈谈 php 文件锁
Feb 19 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
PHP使用递归按层级查找数据的方法
Nov 10 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
Phpbean路由转发的php代码
2008/01/10 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
新手简单了解vue
2019/05/29 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
Python遍历pandas数据方法总结
2018/02/09 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
python实现按行分割文件
2019/07/22 Python
Django中的用户身份验证示例详解
2019/08/07 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
2019/08/29 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
python实现学生成绩测评系统
2020/06/22 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
小学班主任评语大全
2014/04/23 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
书香家庭事迹材料
2014/05/09 职场文书
2014年党支部承诺书
2014/05/30 职场文书
承诺函格式模板
2015/01/21 职场文书
司机岗位职责范本
2015/04/10 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python