博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel 开启跨域功能
阅读量:4293 次
发布时间:2019-05-27

本文共 2259 字,大约阅读时间需要 7 分钟。

人在江湖走,哪有不湿鞋?

经常做api开发的的时候,总会遇到跨域的情况,特别是前后端完全分离的情况,为什么会这样呢?

出于安全性的原因,浏览器会限制 Script 中的跨域请求。由于 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 构造 HTTP 请求的应用只能访问自己的域名,如果需要构造跨域的请求,那么开发者需要配合浏览器做出一些允许跨域的配置。

解决办法有很多,主要说下两种:

方法之一,修改nginx

修改web服务器的配置允许跨域,一劳永逸,以nginx为例:

在站点配置节点下添加:

server{	listen       80;	index index.html index.htm index.php;	root  /www/public/;			add_header Access-Control-Allow-Origin *;	add_header Access-Control-Allow-Headers "x-requested-with,Authorization,Accept, Origin, X-Requested-With, Content-Type, Last-Modified";    add_header Access-Control-Allow-Methods GET,POST;    add_header Access-Control-Max-Age 1728000;        # ....}

方法之二,在php上做手脚

虽然修改nginx配置是挺方便,让你懒到不用改一行代码,但:

不够灵活,不能针对某个接口去允许跨域,只能全局设置,不够安全;

条件不一定允许,很多时候不一定拥有nignx的修改权限。

这里说下laravel框架里设置跨域:

首先,您需要一个中间件:

server('HTTP_ORIGIN') ? $request->server('HTTP_ORIGIN') : ''; $originHost = parse_url($origin, PHP_URL_HOST); $originPort = parse_url($origin, PHP_URL_PORT); $originHost .= $originPort ? ':' . $originPort : ''; // 允许跨域的域名 可以加在配置里 $allowOriginHost = [ 'test.com', ]; $response = $next($request); if (in_array($originHost, $allowOriginHost)) { $response->header('Access-Control-Allow-Origin', $origin); $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN, Last-Modified'); $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS'); $response->header('Access-Control-Allow-Credentials', 'true'); } return $response; }}

然后注册中间件,app/Http/Kernel.php

protected $middlewareGroups = [        // ....        'api.cross' => [            \App\Http\Middleware\EnableCrossRequest::class,        ],        // ....    ];

然后,在需要跨域的路由上加上该中间件

Route::group([    'prefix'     => 'api',    'middleware' => ['api.cross'],], function () {    // 路由    });

解决axios跨域时,发送post请求变options的问题

跨域遇到复杂请求时, 会先发送options去试探是否支持跨域, 所以有两次请求完全正常,但会导致程序重复处理,所以可以通过以下方法屏蔽options请求

Route::options('/{all}', function () {    return response('');})->where(['all' => '([a-zA-Z0-9-]|_|/)+']);

转载地址:http://cmuws.baihongyu.com/

你可能感兴趣的文章
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
X 分钟速成 Python
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
网格马丁格尔交易法
查看>>
一行代码让 Python 的运行速度提高100倍
查看>>
一行 Python 实现并行化 -- 日常多线程操作的新思路
查看>>
期货市场的运作机制
查看>>
一文精通 crontab从入门到出坑
查看>>
股票连续跌停后开板表现
查看>>
东航期货行情接口和交易接口(20190509)
查看>>
ubnutu系统完美克隆至新硬盘,系统备份迁移至新硬盘
查看>>
ubnutu系统完美克隆至新硬盘,系统备份迁移至新硬盘
查看>>
东航期货模拟交易brockerid(期货公司的客户号)
查看>>
史上最全量化资源整理
查看>>
vnpy2.0安装后报错ModuleNotFoundError: No module named 'vnpy.api.ctp.vnctpmd'
查看>>
VNPY2.0火币期货交易接口配置使用
查看>>
win10和ubuntu18双系统时间同步(20190604亲测可行)
查看>>
重启小狼毫输入法,rime输入法重启
查看>>