关于跨域时option请求无法被中间件捕获的问题

深林孤鹰

可以捕获的情况:


Route::group('/adminapi', function() {
  Route::options('/v1/setting/user', [app\controller\adminapi\v1\setting\UserController::class, 'index']);
  //或者:Route::any('/v1/setting/user', [app\controller\adminapi\v1\setting\UserController::class, 'index']);
  。。。
})->middleware([\app\middleware\AccessControlMiddleware::class]);

上面两种情况,中间件可以正常捕获到option请求,但有一种情况:


Route::group('/adminapi', function() {
  Route::resource('/v1/setting/user', [app\controller\adminapi\v1\setting\UserController::class, ''index', 'show', 'store', 'update', 'destroy'']);
  。。。

  Route::fallback(function() {
    echo "fallback: " . request()->method() . PHP_EOL;
    return ret_value(-1, "404", null, 404);
  });
})->middleware([\app\middleware\AccessControlMiddleware::class]);

却无法在中间件或fallback中获得option请求,直接返回跨域错误。请问如果需要resource处理跨域,则必须在resource下面加上 Route::options('/v1/setting/user', function(){}); 吗,感觉不太方便。。

(另外,希望作者大神能修复DELETE请求带Body的奇特问题,可以直接忽略Body的,服务器不应该因为客户端的任何请求出现问题。。。)

845 1 0
1个回答

walkor

Route::fallback 不支持中间件。
resource跨域需要定义options行为,框架不可能自作主张给你定义一个options路由。

DELETE 请求带body和get带body后面会考虑支持

  • 深林孤鹰 2022-09-15

    谢谢大神~明白了,刚才调试又发现个问题:
    Route::group 里定义的 Route::fallback 仍然是全局的?我以为只是在group中起作用,我在两个group里定义了两个fallback,谁知只有一个启用,且是全局的。。。

    另外还有一个疑问,路由支持通配符吗?比如 Route::option('/v1/setting/user/*',。。。),(我估计是不支持的吧)

  • walkor 2022-09-15

    Route::fallback 是全局的。
    支持 Route::option('/v1/setting/user/{id}',。。。) 这种

  • 深林孤鹰 2022-09-15

    了解,看来先用这个办法来解决吧:
    Route::resource('/v1/setting/user', app\controller\adminapi\v1\setting\UserController::class, ['index', 'show', 'store', 'update', 'destroy']);
    Route::options('/v1/setting/user[/{id}]', function(){});

    另外希望有局部的fallback,否则使用路由实现多应用时fallback不好单独配置了。。。

年代过于久远,无法发表回答
🔝