当 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;
}
}
然后添加到
bootstrap/app.php
$app->middleware([
App\Http\Middleware\CorsMiddleware::class, // cors middleware
]);
使用
POST
请求时,一切正常,但是在执行 GET
请求时,会发生 CORS 错误。非常感谢任何帮助、想法,提前致谢。
我的前端应用程序在
http://localhost:3000
(NUXT) 上运行,Lumen 应用程序在 http://localhost:8000
上运行
此问题的另一种解决方案可以是:
在
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, GET, POST, PUT, 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);
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;
}
}
参考cors教程
希望这对你有用!!