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

Laravel博客URL修改方案:将详情页ID替换为文章标题

实现Laravel博客URL用文章标题替代数字ID的方案

1. 调整路由配置

把你现有的博客详情路由修改为接受文章slug(格式化后的友好标题),同时开启Laravel模型绑定简化查询逻辑:

// 替换原有/blog-details路由
Route::get('/blog-details/{post:slug}', [HomeController::class, 'blogDetails'])->name('blogDetails');

{post:slug}表示通过Post模型的slug字段匹配路由参数,框架会自动查询对应文章实例。

2. 为文章模型添加Slug字段

首先在博客文章数据表中新增slug字段(字符串类型,设置唯一索引),然后在对应模型(如Post.php)中添加自动生成slug的逻辑:

use Illuminate\Support\Str;

class Post extends Model
{
    protected static function booted()
    {
        static::creating(function ($post) {
            // 基于标题生成基础slug
            $post->slug = Str::slug($post->title);
            // 处理slug重复情况,追加随机字符串保证唯一性
            while (static::whereSlug($post->slug)->exists()) {
                $post->slug = Str::slug($post->title) . '-' . Str::random(5);
            }
        });
    }
}

若已有存量文章,可编写一次性Artisan命令批量生成slug。

3. 修改控制器方法

借助模型绑定,控制器方法可直接接收Post实例,无需手动查询:

public function blogDetails(Post $post)
{
    return view('blog.details', compact('post'));
}

若暂时不想用模型绑定,也可手动通过slug查询:

public function blogDetails($slug)
{
    $post = Post::where('slug', $slug)->firstOrFail();
    return view('blog.details', compact('post'));
}

4. 更新前端链接生成

将原来用文章ID生成链接的逻辑,替换为使用slug:

<!-- 替换旧的ID传参方式 -->
<a href="{{ route('blogDetails', ['slug' => $post->slug]) }}">{{ $post->title }}</a>

5. 旧URL兼容处理(可选)

若要保证/blog-details/125这类旧URL仍可访问,可添加重定向路由:

// 旧ID格式URL永久重定向到新slug URL
Route::get('/blog-details/{id}', function ($id) {
    $post = Post::findOrFail($id);
    return redirect()->route('blogDetails', ['slug' => $post->slug], 301);
});

301永久重定向有助于SEO,告知搜索引擎旧地址已永久迁移。

内容的提问来源于stack exchange,提问作者ashik arman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:52:41