在 htaccess 中使用正则表达式进行 301 重定向

Posted

技术标签:

【中文标题】在 htaccess 中使用正则表达式进行 301 重定向【英文标题】:Using regular expression in htaccess for 301 redirects 【发布时间】:2013-05-15 23:08:55 【问题描述】:

我有一个 Wordpress 博客,我将博客文章从我的博客重定向到我的博客,格式如下:

旧博客称为“新闻”,新博客简称为“博客”——两者都存在于同一个域中的子目录中,如下所示。

旧的“新闻”博客结构

http://www.example.com/news/new-android-os-3431

新的“博客”博客结构

http://www.example.com/blog/new-android-os

基本上这个重定向需要做两件事:-

    重定向到“博客”目录 在相同的结构中保留帖子名称,但删除 URL 末尾的最后一组数字

我有大约 900 多个帖子需要设置重定向 - 我知道我可以手动添加每个帖子,但这需要一些时间。谁能指出这是否可以直接在 htaccess 文件中使用正则表达式来最小化这个过程?

我的 htaccess 目前看起来像这样:

# BEGIN WordPress
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteBase /news/
 RewriteRule ^index\.php$ - [L]
 RewriteCond %REQUEST_FILENAME !-f
 RewriteCond %REQUEST_FILENAME !-d
 RewriteRule . /news/index.php [L]
</IfModule>
# END WordPress

【问题讨论】:

【参考方案1】:

使用 mod_alias:

RedirectMatch 301 ^/news/(.+?)(-[0-9]+)?$ /blog/$1

或使用 mod_rewrite:

RewriteEngine On
RewriteRule ^news/(.+?)(-[0-9]+)?$ /blog/$1 [L,R=301]

【讨论】:

谢谢乔恩,我会试一试 - 我真的需要学习 RegExp :) 这几乎可以工作 - 知道我如何执行以下操作:- 只返回 1 美元:'new-android-os' 让 2 美元返回余数 '-3431' 我想我需要以某种方式开始字符串末尾的正则表达式并删除最后一个整数。 第二个想法再次检查正则表达式后,它们都应该工作(这是漫长的一天)出于某种原因 - 即使我知道正则表达式是正确的(根据 gskinner 的 RegExpr 应用程序)原因 Wordpress 本身将其重定向到“博客”博客,但使用现有的帖子标题,而不删除带有数字的最后一部分.. 奇怪?! @Zabs 这就是它应该做的。给定 URI /news/abcd-efg-hijk-1234,$1 将是 abcd-efg-hijk,按 (.+?) 表达式分组,$2 将是 -1234,按(可选)(-[0-9]+)? 表达式分组。 最后这行得通(基本上与乔恩林斯相同,但有细微差别)再次感谢乔恩! RedirectMatch ^/news/(.+?)(-[0-9]+)(/)?$ /blog/$1

以上是关于在 htaccess 中使用正则表达式进行 301 重定向的主要内容,如果未能解决你的问题,请参考以下文章

高分求301重定向的htaccess规则写法

使用 .htaccess 进行大规模 301 重定向

301 重定向.htaccess

伪静态规则写法RewriteRule-htaccess详细语法使用

PHP 伪静态规则写法RewriteRule-htaccess详细语法使用

使用正则表达式将 301 重定向到具有不同编号的新 url