在具有授权标头的 GET 请求之前的选项请求在精简框架 4 中不起作用



我已经克隆了已经实现CORS的纤细骨架(https://github.com/slimphp/Slim-Skeleton(。 但是当 API 在 GET 之前调用 OPTIONS 时,它会发送 405 错误"方法不允许。必须是以下之一:GET">

这是我遇到此错误的路线。$group->get('/users', ListUsersAction::class);

$app->group('', function (Group $group) {
$group->post('/user/create', CreateUsersAction::class);
$group->get('/users', ListUsersAction::class);
$group->get('/user/{id}', ViewUserAction::class);
})->add(AuthenticationMiddleware::class);

同样的路线是从邮递员那里工作的。如果我从标头中删除授权令牌,则相同的路由将起作用。

执行甚至没有到达"身份验证中间件"的第一行。

但是,我通过添加没有"身份验证中间件"的相同选项路由来测试它。

喜欢这个:

$app->options('/users', function(Request $request, Response $response) {return $response;});
$app->group('', function (Group $group) {
$group->post('/user/create', CreateUsersAction::class);
$group->get('/users', ListUsersAction::class);
$group->get('/user/{id}', ViewUserAction::class);
})->add(AuthenticationMiddleware::class);

这是有效的。所以我想我忘了添加一些代码,或者我做了任何导致错误的错误,或者骨架有一个错误。

谁能帮忙? 提前谢谢。

好的,我找到了解决方案。

您可以使用通配符OPTIONS请求来避免此问题/错误。 下面是一个示例:

$app->options('/{routes:.+}', function ($request, $response, $args) {
return $response;
});

我已经测试过它,目前对我来说工作正常。


如前所述,在我的测试中,我通过为/users创建OPTIONS路由来尝试它,它正在工作,但为所有创建的 API 路由创建OPTINOS路由没有意义,这是通配符的解决方案OPTIONS路由。

感谢您@odan花时间发表评论,但通配符OPTIONS路线是更好的解决方案。

我只是在我想使用的地方添加了所有路由的选项:

示例 如果我在/api/user 路由中使用它,那么我添加以下代码:

$app->options('/api/user', function ($request, $response, $args) {
return $response;
});

最新更新