如何在htaccess中进行301重定向,同时保留原始页面的slug

时间:2013-06-06 19:59:36

标签: regex wordpress .htaccess http-status-code-301

我们正在将我们的博客迁移到Wordpress,并且需要为所有预先存在的网址设置301。

root的现有结构如下:

/blog/bid/148509/The-Role-of-a-Father

我们需要做的是转到

我们新的Wordpress博客上的

/the-role-of-a-father(来自root用户)。

我遇到的一些问题如下:

  1. 我不知道如何做一个RewriteRule来保持原始结尾的slug一样。
  2. /bid/之后的数字永远不会是一致的,所以我需要忽略这些数字的东西,但之后不会忽略标题slu。
  3. 我需要最终的网址转换为小写。
  4. 我知道这要求很多。任何帮助和资源都会非常有用!

2 个答案:

答案 0 :(得分:3)

通过大量研究语法,正则表达式和变量信息,我能够弄清楚如何做到这一点。

为了帮助那些也可能不熟悉.htacces,rewrites和/或regex的人,我发布了我的解决方案,以及我学到的东西。

解决我问题的最终产品:

RewriteRule ^blog/bid/[0-9].*/(.*)$ /$2? [R=301,L,NC]

完整的.htaccess看起来像这样:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /

RewriteRule ^blog/bid/[0-9].*/(.*)$ /$1? [R=301,L,NC]


</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>

# END WordPress

基本上我所做的是在模式上使用一些正则表达式魔法。由于/bid/之后的数字总是发生变化,使用正则表达式我可以说“匹配此模式,无论其中包含哪些数字”这是使用[0-9].*

完成的

[0-9]匹配编号为0-9的任何字符。 .匹配任何单个字符,*匹配该字符的0个或多个实例。

下一部分是魔术发生的地方。之后的slug(永久链接)与.*匹配,并且在()中包含时将保存为变量。

然后我可以在我的重写的替换部分中使用该变量。 $1是表示模式部分中(.*)的变量。如果您在()中包含更多部分,则可以使用$1$2等来使用初始模式中保存的变量。

完成后我设置了我的标志:R=301设置标题重定向,告诉搜索引擎内容已永久移动。 L是匹配该模式时应用的最后一条规则(即不要继续尝试匹配重写)。 NC指定大写无关紧要。

注意

特别注意规则的间距。没有足够的或太多可能导致整个网站崩溃。特别重要的是要知道在flags部分中,逗号之间没有空格。那点我。

答案 1 :(得分:0)

迁移博客时,您需要使用301重定向。

根据定义,

301重定向将更改网址栏中的路径。

如果您需要将其设为小写,则需要从内存中执行所有这些步骤。

在您的VirtualHost中,添加RewriteMap lc int:tolower

在.htaccess中,添加:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]

RewriteRule /blog/bid/([0-9]+)/(.*) /$2 [R=301,l]