Ajax 在Lumen API上启用CORS

Ajax 在Lumen API上启用CORS,ajax,laravel,lumen,Ajax,Laravel,Lumen,我知道这是一个众所周知的问题,但我已经尝试了几乎所有的方法,我仍然坚持这一点。我有一个简单的项目,结构如下: [Client] => [Gateway] => [API] Laravel 6 Lumen 6 Lumen 6 localhost:8000 localhost:8001

我知道这是一个众所周知的问题,但我已经尝试了几乎所有的方法,我仍然坚持这一点。我有一个简单的项目,结构如下:

                [Client]       =>     [Gateway]       =>      [API] 
                Laravel 6              Lumen 6               Lumen 6
             localhost:8000         localhost:8001       localhost:8002
因为我刚开始做这个项目只是为了证明它是否有效,所以我已经禁用了所有的
auth
东西

在我的API上,我在
public
中有一个名为
uploads
的文件夹(基本上在
http://localhost:8002/uploads/audio.amr
)其中我有一个音频文件(.amr),我正试图从客户端视图播放它

由于html不能播放.amr文件,我不得不使用插件。我用的是这个

[客户端] 我制作了一份ajax请愿书来获取音频文件的url。通过guzzle的客户端网关连接,网关也通过API连接,我成功地获得了url
http://localhost:8002/uploads/audio.amr

 $.ajaxSetup({
     headers: {
          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
     }
});

$.ajax({
     url : 'client/get_url_audio',
     type : 'GET',
     data : {
     },
     dataType:'json',
     success : function(data) {
         /** Here's the way to play the file */
         var amr = new BenzAMRRecorder();
         amr.initWithUrl(data['url']).then(function() {
            amr.play();
         });

     },

});
我成功获取了url,但当BenzAMRRecorder尝试访问url
http://localhost:8002/uploads/audio.amr
我遇到了这个错误:

错误:

CORS策略已阻止从源“”访问“”处的XMLHttpRequest:请求的资源上不存在“访问控制允许源”标头

我已经阅读了很多解决此问题的方法,并在API上添加了一个
Corsmidware
,其句柄函数如下:

public function handle($request, Closure $next)
{
    $headers = [
        'Access-Control-Allow-Origin'      => '*',
        'Access-Control-Allow-Methods'     => 'POST, GET, OPTIONS, PUT, DELETE',
        'Access-Control-Allow-Credentials' => 'true',
        'Access-Control-Max-Age'           => '86400',
        'Access-Control-Allow-Headers'     => 'Content-Type, Authorization, X-Requested-With'
    ];

    if ($request->isMethod('OPTIONS'))
    {
        return response()->json('{"method":"OPTIONS"}', 200, $headers);
    }

    $response = $next($request);
    foreach($headers as $key => $value)
    {
        $response->header($key, $value);
    }

    return $response;

}
然后在
bootstrap/app.php上添加

$app->middleware([
      App\Http\Middleware\Cors::class
]);
但我还是犯了同样的错误。我想的是,当方法
amr.initWithUrl(data['url'])
访问API文件夹时,它不会进入中间件并尝试直接访问文件夹而不经过中间件,但我不知道为什么。有人能帮我解决这个问题吗


编辑:我还尝试了使用
github.com/barryvdh/laravel cors

.htaccess
文件中添加以下内容,该文件来自保存您尝试访问的资源的服务器:

Header Set Access-Control-Allow-Origin "*"


我不知道它在Lumen中是否有效,但对于Laravel,我使用此软件包取得了很多成功。

您可能错过了CORS中间件的标题
X-CSRF-TOKEN

$headers = [
    ....

    // You will need to add ALL headers sent from your client
    'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With, X-CSRF-TOKEN'
];

uploads
是来自
/public
的文件夹还是web路由?是,来自
public
。因为我运行了命令
php-S localhost:8000-t./public
,所以我只是尝试了一下,但仍然无法工作。甚至尝试将其放入
中,尝试将中间件中的所有头添加到htaccess中。在lumen的指令之前添加它们。仍然不起作用。我放弃了这一点,我正试图从API中获取音频文件,然后将其保存在客户端公用文件夹中,然后插件将在本地读取该文件,而不是从API中读取,我希望它能工作!