Laravel 8.x 中 GET 参数取不到的主因是 Nginx 未透传查询参数,需确保 location / 块中配置 try_files $uri $uri/ /index.php?$args;(结尾为 $args),并检查宝塔运行目录设为 /public、防跨站攻击已关闭,修改后重载 Nginx 配置。

GET参数取不到:Nginx重写规则缺失
最常见的情况是Nginx没把查询参数透传给PHP,导致$request->query()或$request->input()始终为空。这不是Laravel代码问题,而是Web服务器配置断链。
- 检查Nginx配置中
location /块是否包含try_files $uri $uri/ /index.php?$args;(注意结尾是$args,不是$is_args$args) - 宝塔用户请进入站点设置 → “网站目录” → 确保“运行目录”设为
/public,且“防跨站攻击”已关闭(它会拦截_GET) - 修改后执行
sudo nginx -t && sudo systemctl reload nginx,再测试curl "http://yoursite.test/test?foo=bar"是否能在控制器里拿到$request->query('foo')
$request->user误当GET参数用
很多人把$request->user当成取URL里?user=admin的写法,结果永远返回null或false——因为$request->user()是认证方法,$request->user这个属性根本不存在。
- 正确取GET参数:用
$request->query('user')(仅GET)或$request->input('user')(GET/POST通用) - 错误写法示例:
if ($request->user == 'admin')→ 会静默失败,不报错但逻辑走不通 - 中间件里尤其要小心:Laravel 8+ 对
Request对象属性访问更严格,未定义属性直接返回null,不会触发Notice
Laravel 8+ 路由组中间件格式导致参数丢失
如果你在Route::group()里用了嵌套数组声明中间件(比如[[‘auth’]]),Laravel 8会解析失败,整个路由注册中断,后续请求甚至进不了控制器——看起来像“GET参数丢了”,其实是路由根本没注册成功。
- 检查
routes/web.php中是否有类似->group([ [AuthMiddleware::class] ], fn() => ...)的写法 - 必须改为扁平化数组:
->middleware(['web', 'auth'])->group(...)或->group(['middleware' => ['web', 'auth']], ...) - 运行
php artisan route:list --name=test-route确认目标路由是否出现在列表里,没出现就说明路由加载失败
PHP版本与命名参数混淆引发语法中断
虽然这是GET参数问题,但升级后常连带暴露底层PHP兼容性问题:有人在迁移文件或配置里误用PHP 8命名参数(如column:'title'),导致PHP解析器直接崩溃,整个请求生命周期终止——你根本收不到GET参数,因为连Request对象都没构建出来。
- 报错
syntax error, unexpected ':'时,立刻检查所有.php文件(尤其是database/migrations/和config/下)是否含key: value式写法 - Laravel 8支持PHP 7.3+,但命名参数是PHP 8.0+特性,低版本PHP遇到
column:'title'会直接Parse Error - 修复方式:删掉冒号前的键名,改用位置参数,例如
$table->string('title')而不是$table->string(column:'title')
dd($request->all())看原始数据是否到达Laravel层;如果为空,优先查Nginx;如果不为空但query()取不到,再查中间件和路由注册是否完整。很多“参数丢失”本质是请求压根没走到你写的控制器里。


















