如何通过.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
相关产品推荐
相关产品推荐

