thinkphp6跨域时option请求200正式请求失败分析

以前在自有项目中使用thinkphp6接口跨域中间件一直都很正常,这次问题主要出在一个而开项目中。thinkphp6+jwt加之一些使用方法上并不规范,导致前端在请求接口时跨域一直失败。

首先分享一个跨域的中间件,用户可直接复制使用。以下内容放置于“/app/middleware”目录下,取名“CrosDomain.php”。内容如下:

  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\middleware;
  4. use think\Response;
  5. /** * 全局跨域请求处理 * Class CrossDomain * @package app\middleware */
  6. class CrossDomain{
  7.     public function handle($request, \Closure $next)    {
  8.         header('Access-Control-Allow-Origin: *');
  9.         header('Access-Control-Max-Age: 1800');
  10.         header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE');
  11.         header('Access-Control-Allow-Headers: *');
  12.         if (strtoupper($request->method()) == "OPTIONS") {
  13.             return Response::create()->send();
  14.         }
  15.         return $next($request);
  16.     }
  17. }

同时在“/app/middleware.php”文件中增加一句:

  1. <?php
  2. // 全局中间件定义文件
  3. return [
  4.     // 全局请求缓存
  5.     // \think\middleware\CheckRequestCache::class,
  6.     // 多语言加载
  7.     // \think\middleware\LoadLangPack::class,
  8.     // Session初始化
  9.     \think\middleware\SessionInit::class,
  10.     \app\middleware\CrossDomain::class,
  11. ];

其实本身采用Thinkphp6自带的跨域中间件基本上都可以轻松实现跨域。但是这次遇到的问题竟然是option请求成功,正式get或post请求失败。

经过一番排查,最终问题锁定在"header"上,前端请求时header中增加了一个Sign参数,而后端跨域时“Access-Control-Allow-Headers:”列表中没有Sign参数。然后把上述第13行的代码设置为“*”前端跨域成功。

所以日常还是要细心一点,排查“Access-Control-Allow-Methods”和“Access-Control-Allow-Headers”与前端请求的header是否一致。

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!