当前位置:首页 > Hyperf > 正文内容

Hyperf跨域问题的解决方案

陈杰3年前 (2020-12-09)Hyperf5704

Hyperf跨域的问题解决方案


在传统框架中一般来说有两种方案

例如在laravel中直接在入口文件index.php中加上允许跨域代码,或者通过nginx反向代理配置


在laravel中

header('Access-Control-Allow-Origin:*');
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'){
   header('Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS,PATCH');
 // 设置是否允许发送 cookies
 header('Access-Control-Allow-Credentials: true');
   // 设置允许自定义请求头的字段
   header('Access-Control-Allow-Headers: Authorization,Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin');
 exit;
}


但是在hyperf中没有入口文件啊,,,,那么就另外想个办法吧,弄一个中间件来解决也行。

建立一个跨域中间件


<?php
/**
* Author:陈杰
* Blog:http://blog.95shouyou.com
* Email:823380606@qq.com
* Git:https://gitee.com/chen95
* Date:2020/12/8 0008
* Time:11:33
*/


declare(strict_types=1);

namespace App\Middleware;

use Hyperf\Utils\Context;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class CorsMiddleware implements MiddlewareInterface
{
   public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
   {
       $response = Context::get(ResponseInterface::class);
       $response = $response->withHeader('Access-Control-Allow-Origin', '*')
           ->withHeader('Access-Control-Allow-Credentials', 'true')
           // Headers 可以根据实际情况进行改写。
      ->withHeader('Access-Control-Allow-Headers', 'uid,token,Keep-Alive,User-Agent,Cache-Control,Content-Type');

       Context::set(ResponseInterface::class, $response);

       if ($request->getMethod() == 'OPTIONS') {
           return $response;
       }

       return $handler->handle($request);
   }
}


然后再

config/autoload/middlewares.php中注册一下

<?php
declare(strict_types=1);
return [
   'http' => [
       \App\Middleware\CorsMiddleware::class
   ],
];



还有一种方式,直接在nginx配置上加上这句也可以

location / {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'uid,token,Keep-Alive,User-Agent,Cache-Control,Content-Type,Authorization';

    if ($request_method = 'OPTIONS') {
        return 204;
    }
}


扫描二维码至手机访问

扫描二维码推送至手机访问。

版权声明:本文由何烦过虎溪发布,如需转载请注明出处。

转载请注明出处:http://blog.95shouyou.com/?id=20

标签: hyperf跨域
分享给朋友:

相关文章

Hyperf异常类,抛出异常并中断执行

Hyperf异常类,抛出异常并中断执行

在我们的传统的php框架中,我个人习惯代码需要分层的。例如分为 Controller层,Service层,Model层。Controller层就是做个参数接收啊,参数验证之类的事情,然后Service...

Hyperf缓存封装

hyperf官方的缓存文档写得很好,但是对于一个从传统框架比如laravel thinkphp转到这上面来学习的同学就不是很友好了。原理都很好,自动维护缓存,注解缓存这些东西,在我开始学习php的时候...

Hyperf的redis异步队列实战

突发奇想想写一个RTS战略类游戏。RTS战略类游戏核心玩法肯定是有养成啊,比如建筑升级啊,征兵队列啊,之类的,总之就是用户现在点了操作但是拿不到结果,可能要等几十分钟或者更久拿到结果。现在我们来实现以...

Hyperf中间件验证用户登录状态

才开始接触hyperf,就被他惊人的并发处理性能所惊呆了。所以在工作空余之时学习一下hyperf。今天要学习一下hyperf的中间件的使用。新建一个中间件,主要功能就是取每次请求的header头里面的...

Hyperf表单数据验证器

Hyperf表单数据验证器

hyperf虽然基于swoole,但是风格很像laravel,所以上手还是挺快的。记录一下基于hyperf的表单验证器的代码。因为写代码喜欢一把梭,所以太过解耦的验证类就不用了,太麻烦了。简单一点。照...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。