https://www.workerman.net/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);
是不是设置了路由,路由用any,不要用post,跨域请求可能有options请求,只设置post路由会导致跨域出现问题。
post 修改成any 就可以了
跨域的接口用
Route::any()
或者Route::add(['POST', 'OPTIONS'])
谢谢老大,我这边尝试一下
这个路由会有一个问题,如果POST和PUT路径一样,同时使用 Route::add(['POST', 'OPTIONS'] 和 Route::add(['GET', 'OPTIONS'] ,系统会提示:FastRoute\BadRouteException: Cannot register two routes matching "/console/resources/(\d+)" for method "OPTIONS" in /vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php:111
Route::add(['POST', 'PUT', 'OPTIONS']); 放一起
我这个多条路由
上面的路由 Route::put('/{id:\d+}', [ConsoleResource::class, 'update']); 由于这个正则 {id:\d+} 也跨域了
单独在/resources 这个分组下面注册一个OPTIONS类型,匹配所有请求就可以了。OPTIONS请求的作用只是预检而已。
直接放在全局就也是可以的
// 匹配所有options路由
Route::options('[{path:.+}]', function (){
return response('');
});
如果一个uri的put get post等需要单独的action处理的,lscho 给的方案是正解,单独设置一个options路由。
补充一句: 如果没有使用route路由,跨域的话,可以参考