php CORS“*”似乎不适用于Chrome,但适用于Postman

zte4gxcn  于 2023-10-15  发布在  PHP
关注(0)|答案(3)|浏览(232)

我在Laravel中为我的项目创建了一个自定义中间件。它添加了以下标题:

return $next($request)
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
        ->header('Access-Control-Allow-Headers',' Origin, Content-Type, Accept, Authorization, X-Request-With')
        ->header('Access-Control-Allow-Credentials',' true');

中间件似乎对Postman工作得很好。当我通过Postman触发一个POST请求时,你会注意到头部已经被添加到响应中:

然而,对于Chrome来说,这似乎不起作用。查看从Google Chrome返回的头文件(相同的请求,使用axios进行调用):

这将导致Google Chrome控制台出现以下错误:
从源“http://localhost:3000”访问“http://127.0.0.1:8000/auth/jwt/token "处的XMLHttpRequest已被CORS策略阻止:对印前检查请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。
我做错了什么/导致了这个奇怪的问题?

r1zhe5dt

r1zhe5dt1#

与其创建自定义的Laravel中间件,我强烈建议使用Laravel CORS Package。没有必要重新发明轮子。

wwtsj6pe

wwtsj6pe2#

只需将类似的脚本放在文件的顶部,并使用die()。

<?php
if (isset($_SERVER["REQUEST_METHOD"])) {
    if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") {
        header("Access-Control-Allow-Origin: *");
        header("Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE");

        // header("Access-Control-Allow-Headers: X-Protection-Token");

        die();
    }
}

如果你能翻译成Laravel,那就更好了。实现示例为here

rfbsl7qr

rfbsl7qr3#

我知道这篇文章有点旧,现在Laravel在Roll/cors.php文件中提供了一个集成的cors解决方案,但关于这一点一直令人头痛的是,有一行写着“路径”。

'paths' => ['api/*', 'sanctum/csrf-cookie'];

这是主要的问题,让这个值就像这样:

'paths' => ['*'];

或者在你的API中为每个路由插入一个数组,你的cors问题就解决了!只是为了澄清,Cors不是一个防火墙, Postman 不发送飞行前或其他一些额外的信息,Chrome做。

相关问题