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

如何通过.htaccess将固定链接修改为ID+标题格式?

没问题,我来帮你搞定这个固定链接格式的调整。先看你现有的.htaccess配置,我们需要修改文章相关的重写规则,同时处理旧链接的跳转问题——因为文章标题是存在数据库里的动态内容,单靠.htaccess没法完成全部,得配合一点PHP逻辑。

第一步:更新.htaccess的重写规则

你需要调整原有文章规则,让它能匹配带标题的新URL格式,同时把旧URL引导到PHP做跳转。修改后的完整.htaccess代码如下:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /clients/ohmynews/web/

    # 匹配新URL格式:/article/1234/your-title/ 或 /article/1234/your-title
    RewriteRule ^/?article/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ detail.php?did=$1 [L,NC]

    # 处理旧URL:将/article/1234/或/article/1234转发到detail.php做301跳转
    RewriteRule ^/?article/([a-zA-Z0-9_-]+)/?$ detail.php?did=$1 [L,NC,R=301]

    # 保留原有其他业务规则
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/?([a-zA-Z0-9_-]+)$ listing.php?lid=$1
    RewriteRule ^/?search/([a-zA-Z0-9_-]+)$ search.php?keys=$1

    DirectoryIndex index.php
    ErrorDocument 404 http://wipstage.com/clients/ohmynews/web/
</IfModule>

第二步:在detail.php中添加动态跳转逻辑

因为标题是存在数据库里的动态内容,.htaccess没法直接知道某篇文章对应的标题slug,所以需要在detail.php里加一段逻辑,当用户访问旧链接时,自动跳转到带标题的新链接:

<?php
// 获取文章ID
$did = isset($_GET['did']) ? $_GET['did'] : '';

if ($did) {
    // 这里替换成你实际的数据库查询逻辑,获取对应文章的标题slug
    // 示例:假设你的文章表是`articles`,标题slug字段是`title_slug`
    $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass');
    $stmt = $pdo->prepare("SELECT title_slug FROM articles WHERE did = ?");
    $stmt->execute([$did]);
    $article = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($article && !empty($article['title_slug'])) {
        // 构造新的带标题的URL
        $newUrl = "/clients/ohmynews/web/article/{$did}/{$article['title_slug']}/";
        // 发送301永久重定向,告诉搜索引擎更新索引
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: {$newUrl}");
        exit;
    }
}

// 继续执行原来的detail.php业务逻辑...
?>

关键细节说明

  • 新的重写规则里,^/?article/([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$同时匹配带尾部斜杠和不带斜杠的新URL,[NC]表示不区分大小写,[L]表示匹配到这条规则后就停止处理后续规则。
  • 301重定向是永久跳转,能保证旧链接的SEO权重传递到新链接,用户访问旧链接也会自动跳转到新格式的链接。
  • 如果你的文章标题slug包含中文或其他特殊字符,需要把正则里的[a-zA-Z0-9_-]+改成([\p{L}0-9_-]+)(需要你的服务器mod_rewrite支持Unicode匹配)。

内容的提问来源于stack exchange,提问作者Mun Kiat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:35:09