You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:25:27