http://www.wtbis.cn/doc/webman/middleware.html
middleware.php 配置
return [
'' => [
\app\middleware\AccessControlMiddleware::class,
]
];
AccessControlMiddleware
declare(strict_types=1);
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class AccessControlMiddleware implements MiddlewareInterface
{
/**
* @param Request $request
* @param callable $next
* @return Response
*/
public function process(Request $request, callable $next): Response
{
$response = $request->method() == 'OPTIONS' ? response('') : $next($request);
$response->withHeaders([
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Headers' => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-Requested-With,Origin',
'Access-Control-Allow-Methods' => 'GET,POST,PUT,DELETE,OPTIONS',
]);
return $response;
}
}
var_dump(11111111111111);
$response = $request->method() == 'OPTIONS' ? response('') : $next($request);
var_dump(222222222222222);
是不是設(shè)置了路由,路由用any,不要用post,跨域請(qǐng)求可能有options請(qǐng)求,只設(shè)置post路由會(huì)導(dǎo)致跨域出現(xiàn)問(wèn)題。
這個(gè)路由會(huì)有一個(gè)問(wèn)題,如果POST和PUT路徑一樣,同時(shí)使用 Route::add(['POST', 'OPTIONS'] 和 Route::add(['GET', 'OPTIONS'] ,系統(tǒng)會(huì)提示:FastRoute\BadRouteException: Cannot register two routes matching "/console/resources/(\d+)" for method "OPTIONS" in /vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php:111
我這個(gè)多條路由
Route::group('/resources', function () {
Route::get('', [ConsoleResource::class, 'getList']);
Route::add(['POST', 'OPTIONS'],'', [ConsoleResource::class, 'create']);
Route::put('/{id:\d+}', [ConsoleResource::class, 'update']);
Route::delete('/{id:\d+}', [ConsoleResource::class, 'delete']);
Route::add(['GET', 'OPTIONS'],'/{id:\d+}', [ConsoleResource::class, 'detail']);
Route::add(['POST', 'OPTIONS'],'/{id:\d+}/authorize', [ConsoleResource::class, 'authorizeApi']);
});
上面的路由 Route::put('/{id:\d+}', [ConsoleResource::class, 'update']); 由于這個(gè)正則 {id:\d+} 也跨域了
單獨(dú)在/resources 這個(gè)分組下面注冊(cè)一個(gè)OPTIONS類型,匹配所有請(qǐng)求就可以了。OPTIONS請(qǐng)求的作用只是預(yù)檢而已。
直接放在全局就也是可以的
// 匹配所有options路由
Route::options('[{path:.+}]', function (){
return response('');
});
如果一個(gè)uri的put get post等需要單獨(dú)的action處理的,lscho 給的方案是正解,單獨(dú)設(shè)置一個(gè)options路由。
Route::group('/resources', function () {
// 匹配 /resources 下的所有options路由
Route::options('[{path:.+}]', function (){
return response('');
})->middleware([\app\middleware\跨域中間件類名::class]);
// ........
});