OPTIONS跨域问题

abinx

问题描述

浏览器跨域会发生两个请求 一个OPTIONS预请求 如果设置的只有post路由 路由里面找不到OPTIONS路由就会直接返回404 或者回退到Route::fallback() 不会调用跨域中间件 造成跨域失败
截图

截图

为此你搜索到了哪些方案及不适用的原因

经实验:设置any路由能正常跨域 我路由都是根据不同的method实现不同的功能 没办法都用any路由 这个怎么处理???

1418 2 2
2个回答

keytehu

https://www.workerman.net/doc/webman/middleware.html#%E7%A4%BA%E4%BE%8B%EF%BC%9A%E8%B7%A8%E5%9F%9F%E8%AF%B7%E6%B1%82%E4%B8%AD%E9%97%B4%E4%BB%B6

文档写了
跨域可能会产生OPTIONS请求,我们不想OPTIONS请求进入到控制器,所以我们为OPTIONS请求直接返回了一个空的响应(response(''))实现请求拦截。
如果你的接口需要设置路由,请使用Route::any(..) 或者 Route::add(['POST', 'OPTIONS'], ..)设置。

  • abinx 2023-02-13

    已解决 加一行就行了 Route::options('[{path: .+}]', fn() => response('', 204));

markHxz

是不是配置了fallback
fallback不走中间件
你可以在fallback里面配置跨域返回

Route::fallback(function (Request $request) {
    $response = strtoupper($request->method()) === 'OPTIONS' ? response('', 204) : response('', 404);
    $response->withHeaders([
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Allow-Origin' => "*",
        'Access-Control-Allow-Methods' => '*',
        'Access-Control-Allow-Headers' => '*',
    ]);
    return $response;
});
年代过于久远,无法发表回答
🔝