laravel 8 中需用 route::match() 或 route::any() 实现单路由多请求支持,否则仅定义 get 路由时 post 请求会返回 405 错误;match 限定指定方法,any 接收任意方法但需手动校验安全性。

在 Laravel 8 中,当一个 URL 需要同时响应 GET 和 POST 请求(比如表单页既要展示又要提交),又不想重复定义两个路由时,必须用 match 或 any 显式声明多请求支持——否则仅用 Route::get() 定义的路由收到 POST 请求会直接返回 405 Method Not Allowed 错误。
用 match 方法限定多种指定请求类型
方法一:基础写法
在 routes/web.php 中写入 Route::match(['get', 'post'], '/login', function () { return view('login'); });
这一步操作起来很简单,直接把数组和闭包函数填进去就行。
方法二:搭配控制器方法
Route::match(['get', 'post'], '/profile', [ProfileController::class, 'handle']);
【必须确保 ProfileController@handle 方法内部能区分 request()->method() 并分别处理逻辑,否则 GET 进来却执行了 POST 的代码】
方法三:扩展更多请求类型
Route::match(['get', 'post', 'put', 'delete'], '/api/v1/user', [ApiController::class, 'userAction']);
注意:Laravel 默认不启用 PUT/DELETE 等方法的表单模拟,若从前端 HTML 表单触发,需添加 @csrf 和 @method('PUT') 指令,否则实际发送仍是 POST。
用 any 方法接收任意 HTTP 请求类型
第一步:定义路由
Route::any('/webhook', [WebhookController::class, 'receive']);
第二步:在控制器中判断请求类型
public function receive(Request $request) { $method = $request->method(); if ($method === 'POST') { // 处理推送数据 } elseif ($method === 'GET') { // 验证签名或返回说明页 } }
第三步:手动校验安全性
【any 路由会绕过 Laravel 内置的 CSRF 保护,所有 POST/PUT/DELETE 请求都必须自行验证 token 或签名,否则极易被伪造请求攻击】
这一步不能跳过,Laravel 不会对 any 路由自动添加中间件防护。
验证路由是否生效
运行 php artisan route:list --method=GET,POST 查看包含 GET 和 POST 的路由行。
或者执行 php artisan route:list | grep login 查找含 login 字样的路由记录。
如果看到 method 列显示 GET|POST,说明 match 路由已注册成功;若显示 ANY,则是 any 路由。











