如何解决GET 请求结果到 Lumen 8 中的 CORS 错误
当 Axios 向我的 Lumen 应用发送 GET
HTTP 时,我遇到了这个 CORS 问题,发送 POST
HTTP 似乎没问题。我有这个处理 CORS 的中间件,下面是代码
<?PHP namespace App\Http\Middleware;
use Closure;
class CorsMiddleware{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
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;
}
}
$app->middleware([
App\Http\Middleware\CorsMiddleware::class,// cors middleware
]);
对于 POST
请求,一切正常,但是在执行 GET
请求时,会发生 CORS 错误。非常感谢任何帮助和想法,提前致谢。
我的前端应用在 http://localhost:3000
(NUXT) 上运行,而 Lumen 应用在 http://localhost:8000
上运行
下图是错误截图。
解决方法
Lumen 不允许使用 OPTIONS
方法并且会返回状态响应 405 MethodNotAllowed
,因此我们需要将其显式添加到路由中。
修改ServiceProvider.php
:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$request = app('request');
// ALLOW OPTIONS METHOD
if($request->getMethod() === 'OPTIONS') {
app()->options($request->path(),function () {
return response('OK',200)
->header('Access-Control-Allow-Origin','*')
->header('Access-Control-Allow-Methods','OPTIONS,GET,POST,PUT,DELETE')
->header('Access-Control-Allow-Headers','Content-Type,Origin');
});
}
}
}
CorsMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class CorsMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request,Closure $next)
{
$response = $next($request);
$response->header('Access-Control-Allow-Origin','*');
return $response;
}
}
希望这对你有用!!
,这个问题的另一个解决方案是:
在 CatchAllOptionsRequestsProvider.php
目录中创建 App\Providers
<?php namespace App\Providers;
use Illuminate\Support\ServiceProvider;
/**
* If the incoming request is an OPTIONS request
* we will register a handler for the requested route
*/
class CatchAllOptionsRequestsProvider extends ServiceProvider {
public function register()
{
$request = app('request');
if ($request->isMethod('OPTIONS'))
{
app()->options($request->path(),function() { return response('',200); });
}
}
}
CorsMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class CorsMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request,Closure $next)
{
//Intercepts OPTIONS requests
if($request->isMethod('OPTIONS')) {
$response = response('',200);
} else {
// Pass the request to the next middleware
$response = $next($request);
}
// Adds headers to the response
$response->header('Access-Control-Allow-Methods','HEAD,PATCH,DELETE');
$response->header('Access-Control-Allow-Headers',$request->header('Access-Control-Request-Headers'));
$response->header('Access-Control-Allow-Origin','*');
// Sends it
return $response;
}
}
在 bootstrap/app.php
$app->middleware([
App\Http\Middleware\CorsMiddleware::class
]);
$app->register(App\Providers\CatchAllOptionsRequestsProvider::class);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。