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 相关文章推荐
BBS(php & mysql)完整版(一)
Oct 09 PHP
linux iconv方法的使用
Oct 01 PHP
PHP中操作ini配置文件的方法
Apr 25 PHP
简单的php中文转拼音的实现代码
Feb 11 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
PHP单例模式详细介绍
Jul 01 PHP
教大家制作简单的php日历
Nov 17 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
php错误日志简单配置方法
Jul 11 PHP
php基于环形链表解决约瑟夫环问题示例
Nov 07 PHP
laravel 去掉index.php伪静态的操作方法
Oct 12 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 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中文件上传的安全问题
2006/10/09 PHP
PHP实现用户认证及管理完全源码
2007/03/11 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
PHP学习之整理字符串
2011/04/17 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
python使用正则表达式匹配字符串开头并打印示例
2017/01/11 Python
Python 的类、继承和多态详解
2017/07/16 Python
Python中表示字符串的三种方法
2017/09/06 Python
python取代netcat过程分析
2018/02/10 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
海淘母婴商城:国际妈咪
2016/07/23 全球购物
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
网吧消防安全制度
2014/01/28 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
地理教师岗位职责
2014/03/16 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
成绩报告单家长评语
2014/12/30 职场文书
2015迎新晚会开场白
2015/05/29 职场文书