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

求助:CodeIgniter中友好URL(Slugs)实现的教程或网站推荐

嗨,我来帮你梳理下实现友好slug式URL的具体方案,不管是静态预生成还是动态解析的思路都有成熟的做法,你可以根据自己的需求选择:

静态Slug方案(推荐,稳定且SEO友好)

这种方案是提前把slug生成好存在数据库里,是行业内最常用的方式:

  • 第一步:调整数据库结构
    给你存储内容的表(比如文章表、用户表)添加一个slug字段,类型设为VARCHAR(255),并设置为唯一索引,确保每个slug对应唯一的内容。

  • 第二步:编写Slug生成函数
    在创建或编辑内容时,把标题(或其他标识文本)转换成符合URL规范的slug——转小写、替换空格为连字符、去除特殊字符。PHP里可以用这个简单的函数:

function generateSlug($text) {
    // 转小写,替换非字母数字的字符为连字符,去除首尾的连字符
    $slug = strtolower(trim(preg_replace('/[^A-Za-z0-9]+/', '-', $text), '-'));
    // 处理重复slug:如果数据库里已有相同的,可以在末尾加数字
    // 比如查询数据库,若存在则拼接"-1"、"-2"直到唯一
    return $slug;
}
  • 第三步:配置URL重写
    需要把请求重定向到你的PHP入口文件(比如index.php),不同服务器配置不同:

    • Apache:在项目根目录创建.htaccess文件,添加以下规则:
      RewriteEngine On
      # 跳过实际存在的文件和目录
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      # 把所有slug形式的URL转发到index.php,传递slug参数
      RewriteRule ^([a-z0-9-]+)$ index.php?slug=$1 [L,QSA]
      
    • Nginx:在服务器配置里添加:
      location / {
          try_files $uri $uri/ /index.php?slug=$uri;
      }
      
  • 第四步:PHP处理请求
    在入口文件里获取slug参数,查询数据库并返回对应内容:

// 假设用PDO连接数据库,避免SQL注入
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass');

if (isset($_GET['slug'])) {
    $slug = $_GET['slug'];
    $stmt = $pdo->prepare("SELECT * FROM your_content_table WHERE slug = ?");
    $stmt->execute([$slug]);
    $content = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($content) {
        // 渲染你的内容页面,比如输出标题、正文等
        echo "<h1>" . htmlspecialchars($content['title']) . "</h1>";
        echo "<p>" . htmlspecialchars($content['content']) . "</p>";
    } else {
        // 内容不存在,返回404
        http_response_code(404);
        echo "<h1>404 - Page Not Found</h1>";
    }
}
动态Slug方案(无需存储,适合简单场景)

如果不想在数据库里存slug,也可以通过动态解析的方式实现,但准确性稍差,仅适合内容标题绝对唯一的场景:

  • 重写规则和静态方案一致,把请求转发到index.php
  • 在PHP里把slug还原成标题格式,然后查询数据库:
if (isset($_GET['slug'])) {
    $slug = $_GET['slug'];
    // 把连字符转回空格,首字母大写
    $title = ucwords(str_replace('-', ' ', $slug));
    // 精准匹配标题(注意:如果有重复标题会出问题)
    $stmt = $pdo->prepare("SELECT * FROM your_content_table WHERE LOWER(title) = LOWER(?)");
    $stmt->execute([$title]);
    $content = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // 后续处理和静态方案一致
}

⚠️ 注意:这种方式如果有相同标题的内容会导致冲突,所以仅适合标题绝对唯一的场景。

额外注意事项
  • Slug唯一性:生成slug时一定要检查数据库是否存在相同值,重复的话可以在末尾添加数字(比如this-is-me-from-php-show-test-2)
  • 旧URL跳转:如果之前有带ID的URL,建议设置301重定向到新的slug URL,利于SEO和用户体验
  • 框架简化:如果用Laravel、Symfony等PHP框架,它们内置了路由支持slug,比如Laravel里可以直接写:
    Route::get('/{slug}', [ContentController::class, 'show']);
    
    然后在控制器方法里通过slug查询内容即可,不用自己配置重写规则。

内容的提问来源于stack exchange,提问作者usman ali zafar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:04:21