Laravel框架如何从URL路径中移除id参数
解决步骤
方案一:通过Laravel路由实现(推荐,无需修改服务器配置)
- 首先修改路由文件,新增无ID的目标路由,同时保留旧路由做301永久重定向,避免旧链接失效:
// 新的无ID目标路由 Route::get('/p/{any}','TestController@dynamic_page')->name('dynamic.page'); // 旧带ID路由做301重定向 Route::get('/p/{id}/{any}', function ($id, $any) { return redirect()->route('dynamic.page', ['any' => $any], 301); });
- 调整控制器查询逻辑,因为现在URL不再传递ID,需要用
any参数(也就是页面唯一标识slug)查询数据:
把控制器dynamic_page方法中原来用ID查询的代码,从类似$page = Page::find($id)改为$page = Page::where('slug', $any)->firstOrFail(),需提前在对应数据表中新增slug字段存储web-test这类唯一标识。
方案二:通过.htaccess重写实现
- 删除你之前添加的错误重写规则,替换为以下规则,需放在Laravel默认的入口重写规则之前:
RewriteEngine On # 匹配/p/数字/任意字符的旧URL,301重定向到不带ID的新URL RewriteRule ^p/[0-9]+/(.*)$ /p/$1 [L,R=301] # 保留Laravel默认的入口重写规则不要修改 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L]
- 修改路由定义,和方案一一致,改为无ID的路由规则:
Route::get('/p/{any}','TestController@dynamic_page')->name('dynamic.page'); - 调整控制器查询逻辑,和方案一一致。
注意:修改.htaccess后需要清空浏览器缓存,301永久重定向会被浏览器默认缓存,未清缓存可能看不到生效效果。
内容的提问来源于stack exchange,提问作者Bhawesh
相关产品推荐
相关产品推荐

