Laravel开启跨域请求的方法


Posted in PHP onOctober 13, 2019

项目中用到了接口,外部调用的时候老是请求不到,本地请求却没问题,查了下说是因为跨域的问题。

根据网上所说解决方法如下:

1、建立中间件Cors.php

命令:php artisan make:middleware Cors

在/app/Http/Middleware/ 目录下会出现一个Cors.php 文件。

2、在handle 方法中加入如下内容:

$response = $next($request);
 $response->header('Access-Control-Allow-Origin', '*');
 $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept, multipart/form-data, application/json');
 $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
 $response->header('Access-Control-Allow-Credentials', 'false');
 return $response;

其中有以下需要注意的地方:

对于跨域访问并需要伴随认证信息的请求,需要在 XMLHttpRequest 实例中指定 withCredentials 为 true。

这个中间件你可以根据自己的需求进行构建,如果需要在请求中伴随认证信息(包含 cookie,session)那么你就需要指定 Access-Control-Allow-Credentials 为 true, 因为对于预请求来说如果你未指定该响应头,那么浏览器会直接忽略该响应。

在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不能指定为 *(这个一定要注意,我就是在这个地方调了好久)

后置中间件只有在正常响应时才会被追加响应头,而如果出现异常,这时响应是不会经过中间件的。

Cors.php文件内容如下:

<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
 /**
 * Handle an incoming request.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Closure $next
 * @return mixed
 */
 public function handle($request, Closure $next)
 {
 $response = $next($request);
 $response->header('Access-Control-Allow-Origin', '*');
 $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept, multipart/form-data, application/json');
 $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
 $response->header('Access-Control-Allow-Credentials', 'false');
 return $response;
 }
}

3、在 Kernel.php文件中的$middleware中加入刚刚添加的中间件:\App\Http\Middleware\Cors::class,

如:

protected $middleware = [
 \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
 \App\Http\Middleware\EncryptCookies::class,
 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
 \Illuminate\Session\Middleware\StartSession::class,
 \Illuminate\View\Middleware\ShareErrorsFromSession::class,
 \App\Http\Middleware\Cors::class,
 ];

以下内容为网络摘抄:

跨源资源共享标准

跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明哪些来源可以通过浏览器访问该服务器上的资源。另外,对哪些会对服务器数据造成破坏性响应的 HTTP 请求方法(特别是 GET 以外的 HTTP 方法,或者搭配某些 MIME 类型的 POST 请求),标准强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获取知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括 Cookies 和 HTTP 认证相关数据)。

跨源共享标准需要浏览器和服务端共同配合才能完成,目前浏览器厂商已经可以将请求部分自动完成,所以跨源资源访问的重点还是在于服务器端。

下面列出一些标准中可用的响应头和请求头。

Response Header

Access-Control-Allow-Origin : 指明哪些请求源被允许访问资源,值可以为 “*”,”null”,或者单个源地址。

Access-Control-Allow-Credentials : 指明当请求中省略 creadentials 标识时响应是否暴露。对于预请求来说,它表明实际的请求中可以包含用户凭证。

Access-Control-Expose-Headers : 指明哪些头信息可以安全的暴露给 CORS API 规范的 API。

Access-Control-Max-Age : 指明预请求可以在预请求缓存中存放多久。

Access-Control-Allow-Methods : 对于预请求来说,哪些请求方式可以用于实际的请求。

Access-Control-Allow-Headers : 对于预请求来说,指明了哪些头信息可以用于实际的请求中。

Origin : 指明预请求或者跨域请求的来源。

Access-Control-Request-Method : 对于预请求来说,指明哪些预请求中的请求方式可以被用在实际的请求中。

Access-Control-Request-Headers : 指明预请求中的哪些头信息可以用于实际的请求中。

Request Header

Origin : 表明发送请求或预请求的来源。

Access-Control-Request-Method : 在发送预请求时带该请求头,表明实际的请求将使用的请求方式。

Access-Control-Request-Headers : 在发送预请求时带有该请求头,表明实际的请求将携带的请求头。

Author:leedaning

以上这篇Laravel开启跨域请求的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
转换中文日期的PHP程序
Oct 09 PHP
cache_lite试用
Feb 14 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
PHP 实现判断用户是否手机访问
Jan 21 PHP
php实现图片局部打马赛克的方法
Feb 11 PHP
PHP传参之传值与传址的区别
Apr 24 PHP
深入理解PHP中的count函数
May 31 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
PHP命令Command模式用法实例分析
Aug 08 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 #PHP
laravel config文件配置全局变量的例子
Oct 13 #PHP
Laravel 读取 config 下的数据方法
Oct 13 #PHP
laravel实现前后台路由分离的方法
Oct 13 #PHP
Laravel数据库读写分离配置的方法
Oct 13 #PHP
Laravel第三方包报class not found的解决方法
Oct 13 #PHP
php7性能提升的原因详解
Oct 13 #PHP
You might like
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
ie与ff下的event事件使用介绍
2013/11/25 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
详解Python中的strftime()方法的使用
2015/05/22 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
详解Python中的正则表达式
2018/07/08 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
浅析Python requests 模块
2020/10/09 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
python定义具名元组实例操作
2021/02/28 Python
住宅质量保证书
2014/04/29 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL