Laravel中如何通过全局中间件实现短URL正确重定向?
解决短URL重定向404问题的步骤
1. 添加兜底路由
当前web.php中没有匹配/wGjxw这类短路径的路由,Laravel会直接返回404,导致中间件根本没机会执行。需要在web.php末尾添加一条匹配所有未定义GET请求的兜底路由,确保请求能进入应用流程:
// 放在web.php最后,保证其他路由优先匹配 Route::get('/{any}', function () { // 无需额外逻辑,仅用于让请求流转到中间件处理 })->where('any', '.*');
2. 优化中间件查询逻辑
你当前存储的short_url是完整全路径(如http://127.0.0.1:8000/wGjxw),这会导致域名或环境变化时匹配失败。建议改为存储相对路径(如/wGjxw),同时调整中间件的查询方式:
调整后的中间件代码
<?php namespace App\Http\Middleware; use App\Models\Url; use Closure; use Illuminate\Http\Request; class RedirectMiddleware { public function handle(Request $request, Closure $next) { // 用请求的相对路径查询,替代全URL匹配 $url = Url::where('short_url', $request->path())->first(); if ($url) { return redirect()->to($url->original_url); } return $next($request); } }
同步修正数据存储逻辑
生成短URL时,仅存储相对路径部分(如生成wGjxw后,存储/wGjxw)。若已有旧数据,可通过SQL批量更新:
UPDATE urls SET short_url = SUBSTRING(short_url, LOCATE('/', short_url, 8));
(该SQL适用于HTTP协议的URL,会截取域名后的相对路径)
3. 确认中间件注册正确性
确保中间件已添加到app/Http/Kernel.php的web中间件组中:
protected $middlewareGroups = [ 'web' => [ // 其他已注册中间件... \App\Http\Middleware\RedirectMiddleware::class, ], ];
验证效果
现在访问http://127.0.0.1:8000/wGjxw时,请求会先匹配兜底路由,进入中间件查询对应Url记录,找到后自动重定向至原URL;若未找到对应记录,会继续执行后续流程,可按需返回自定义404页面。
内容的提问来源于stack exchange,提问作者DeveloperX
相关产品推荐
相关产品推荐

