Laravel创建Request实例前如何替换查询字符串中的编码字符?
解决查询字符串中
%26导致参数提取错误的方案 可以通过自定义Laravel中间件在Request对象处理前拦截并修正查询字符串,具体步骤如下:
1. 创建自定义中间件
在终端执行Artisan命令生成中间件:
php artisan make:middleware FixEncodedAmpersandMiddleware
2. 编写中间件逻辑
打开app/Http/Middleware/FixEncodedAmpersandMiddleware.php,替换handle方法内容:
<?php namespace App\Http\Middleware; use Closure; class FixEncodedAmpersandMiddleware { public function handle($request, Closure $next) { // 获取原始查询字符串 $queryString = $request->getQueryString(); if ($queryString) { // 将编码的%26替换为& $fixedQueryString = str_replace('%26', '&', $queryString); // 重新构建请求的查询参数 parse_str($fixedQueryString, $queryParams); $request->query->replace($queryParams); } return $next($request); } }
3. 注册中间件
全局生效(所有请求都处理)
打开app/Http/Kernel.php,将中间件添加到$middleware数组:
protected $middleware = [ // ... 其他中间件 \App\Http\Middleware\FixEncodedAmpersandMiddleware::class, ];
仅针对API路由生效
如果只需要处理API请求,将中间件添加到$middlewareGroups的api组:
protected $middlewareGroups = [ 'api' => [ // ... 其他中间件 \App\Http\Middleware\FixEncodedAmpersandMiddleware::class, ], ];
4. 验证效果
当请求的查询字符串包含%26时,中间件会自动将其替换为&,Request对象就能正确解析出所有查询参数,和正常编码的请求结果一致。
内容的提问来源于stack exchange,提问作者gzmo
相关产品推荐
相关产品推荐

