Laravel 7修改API前缀为cp后Query Parameters无法获取
问题描述
使用Laravel 7.0 + nWidart/laravel-modules创建模块,将模块RouteServiceProvider.php中的API路由前缀改为cp后,控制器无法接收Query Parameters:
- 控制器中通过
$request->query()获取参数始终返回null - Laravel Telescope无查询参数记录,但Nginx日志显示参数确实被发送
- 执行
php artisan route:list验证路由配置正确 - 将前缀改回
api后功能完全正常
控制器代码
<?php namespace Modules\SomeModule\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Routing\Controller; class PartnerController extends Controller { /** * List all Partners * * @param Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function index(Request $request) { $page = $request->query('page'); // 始终为null $pageSize = $request->query('page_size'); // 始终为null return response()->json(['page' => $page, 'page_size' => $pageSize]); } }
RouteServiceProvider代码
<?php namespace Modules\SomeModule\Providers; use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class RouteServiceProvider extends ServiceProvider { /** * The module namespace to assume when generating URLs to actions. * * @var string */ protected $moduleNamespace = 'Modules\SomeModule\Http\Controllers'; /** * Called before routes are registered. * * Register any model bindings or pattern based filters. * * @return void */ public function boot() { parent::boot(); } /** * Define the routes for the application. * * @return void */ public function map() { $this->mapApiRoutes(); } /** * Define the "api" routes for the application. * * These routes are typically stateless. * * @return void */ protected function mapApiRoutes() { Route::middleware('api') ->prefix('cp') ->namespace($this->moduleNamespace) ->group(module_path('SomeModule', '/Routes/api.php')); } }
解决方案
1. 修正Nginx配置
默认Laravel的Nginx配置中,针对/api前缀有专属的rewrite规则,当你将前缀改为/cp后,需要同步更新Nginx配置:
找到你的站点配置文件(通常位于/etc/nginx/sites-available/或/etc/nginx/conf.d/目录下),添加或修改对应规则:
原默认规则示例:
location /api { try_files $uri $uri/ /index.php?$query_string; }
新增针对/cp的规则:
location /cp { try_files $uri $uri/ /index.php?$query_string; }
或者使用更通用的规则,覆盖所有非静态文件请求:
location / { try_files $uri $uri/ /index.php?$query_string; }
修改完成后重启Nginx:
sudo systemctl restart nginx
2. 验证请求参数传递
在控制器中添加调试代码,确认请求参数是否被服务器接收:
public function index(Request $request) { // 打印完整请求参数集合 dd($request->all()); // 或者直接打印服务器端的查询字符串 dd($_SERVER['QUERY_STRING']); }
如果$_SERVER['QUERY_STRING']能看到参数但$request中没有,需要检查:
app/Http/Kernel.php中的api中间件组是否有自定义中间件干扰参数接收- 全局中间件中是否存在针对
api前缀的特殊参数处理逻辑
3. 清除路由缓存
尽管route:list显示配置正确,仍建议清除路由缓存确保配置生效:
php artisan route:clear
内容的提问来源于stack exchange,提问作者faizan.sh
相关产品推荐
相关产品推荐

