路由定义在 routes/web.php(Web 请求)或 routes/api.php(API 请求)文件中;控制器不负责注册路由,常见404需先确认路由文件是否匹配请求类型。

路由定义在哪个文件里
绝大多数 laravel 项目,路由都写在 routes/web.php(面向 Web 请求)或 routes/api.php(面向 API 请求)。别去 app/http/Controllers 里硬塞路由逻辑——控制器只管处理,不负责注册。
常见错误:改了路由但页面 404,第一反应不是代码错,而是检查当前请求是否走对了路由文件。比如用 postman 测 API 却在 web.php 里写 Route::get(),必然 404 —— web.php 默认带 session、csrf 中间件,api.php 不带,且前缀默认是 /api。
-
web.php自动应用web中间件组(含 session、csrf、加密 cookie) -
api.php自动应用api中间件组(无 session,无 csrf,适合无状态接口) - 自定义路由文件需手动在
app/Providers/RouteServiceProvider.php的map()方法里加载
最简 GET 路由怎么写
不用想太复杂,一个 Route::get() 就能跑起来:
Route::get('/hello', function () { return 'Hi there'; });
注意三点:
- 路径字符串开头不加
/也能工作,但加了更清晰、避免嵌套时出错(比如Route::prefix('v1')下的子路由) - 闭包函数里不能直接访问
$request,要显式声明:function (IlluminateHttpRequest $request) - 返回字符串会自动转成 200 响应;返回数组会自动 jsON 化(仅限
api.php);返回视图要用view('welcome')
带参数的路由怎么声明和取值
URL 参数分两种:必需的(如 /user/{id})和可选的(如 /user/{id?})。关键不是写法,而是「怎么安全取值」:
- 必需参数必须在闭包或控制器方法中声明同名变量:
Route::get('/post/{slug}', function ($slug) { ... }),否则报Missing required parameters for [Route: ...] - 可选参数需设默认值:
function ($slug = 'home'),否则调用时没传会报错 - 正则约束用
where()链式调用:->where('id', '[0-9]+'),避免把/user/abc错误匹配到user/{id}导致后续类型转换失败 - 中文或特殊字符参数必须做 URL 编码,服务端收到的是解码后值,无需再
urldecode()
为什么 POST 路由总提示 TokenMismatchException
这是 web.php 下最常见的报错,根源不在路由本身,而在 CSRF 防护机制被绕过:
- 所有非 GET/HEAD/OPTIONS 请求(包括 POST/PUT/delete)默认需要有效的
_token字段 - 表单里漏了
@csrf指令,或 JS 请求没带上X-CSRF-TOKENheader,就会触发该异常 - API 路由(
api.php)默认不校验 CSRF,所以切记:不要在api.php里注册需要 session 或登录态的页面跳转路由 - 临时关闭 CSRF(仅开发调试):在
app/Http/Middleware/VerifyCsrfToken.php的$except数组里加路径,例如'/debug/*'
真正难搞的不是写路由,是搞清中间件链在哪一层生效、哪些参数被自动注入、哪些错误其实是中间件抛的而不是路由没匹配上。