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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
将一维或多维的数组连接成一个字符串的php代码
Aug 08 PHP
关于PHP语言构造器介绍
Jul 08 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
php实现模拟登陆方正教务系统抓取课表
May 19 PHP
php简单实现多语言切换的方法
May 09 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
PHP长网址与短网址的实现方法
Oct 13 PHP
PHP注释语法规范与命名规范详解篇
Jan 21 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
Sep 17 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使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
php提取微信账单的有效信息
2018/10/01 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
写的htc的数据表格
2007/01/20 Javascript
js兼容标准的表格变色效果
2008/06/28 Javascript
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
javascript call方法使用说明
2010/01/11 Javascript
jquery 问答知识整理
2010/02/11 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
vue文件运行的方法教学
2019/02/12 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
Python psutil模块简单使用实例
2015/04/28 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python如何实现单链表的反转
2020/02/10 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
Django多数据库联用实现方法解析
2020/11/12 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
光声世纪笔试题目
2012/08/25 面试题
历史专业个人求职信范文
2013/12/07 职场文书
cf搞笑广告词
2014/03/14 职场文书
施工单位安全责任书
2014/07/24 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
市场督导岗位职责
2015/04/10 职场文书
工作犯错保证书
2015/05/11 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript