Saturday, July 22, 2017

WordPress修改固定链接后设置301重定向

本站原来使用的WordPress的固定链接结构太长,想修改为最简单的/%postname%.html格式,但各大搜索引擎已经收录了不少文章,修改后可能会影响搜索引擎的收录。所以必须要做一下网站链接的301重定向。

301重定向(301 redirect)是指网址的永久性转移(Permanently Moved),当网站在搜索引擎索引库中的网址发生改变时,搜索引擎并不能及时改变索引库中的网址。网站管理员通过对网址的301重定向转移,可以避免损失来自搜索引擎的用户。更重要的是,通过301重定向转换,URL的权重、Google PR值都能够不受影响地传递。因此301重定向也是网页更改地址后对搜索引擎非常友好的一种方法。

要实现网站的301重定向,有很多方法,新手推荐使用WP Permalinks MigrationRedirection插件,简单友好,自带中文设置界面。也可以通过修改.htaccess文件进行301重定向,从而实现WordPress固定链接形式的更改。

一、使用WordPress插件实现301重定向

使用WordPress插件固定链接301重定向的方法最简单,方法如下:

1、下载并安装倡萌的WordPress插件WP Permalinks Migration

2、启用插件以后,进入WordPress后台的Settings(设置)–>WP Permalinks Migration,可以看到一般会自动识别原来的链接样式,如果没有自动识别原来的链接样式,那就你手动填写,并按左下角的按钮保存设置。

3、在WordPress后台的Settings(设置)–>Permalinks(永久链接)–>修改为你想要的样式,保存即可,这时候,访问原来的链接,就可以自动跳转到你的新链接!

二、利用.htaccess实现URL重定向(redirect)

1、什么是.htaccess
根据维基百科,.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

2、.htaccess中用到的正则表达式
和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求。

^ –> 匹配字符串的开始
$ –> 匹配字符串的结束
^$ –> 可以用于确定字符串,即可以用于确定起点或终点。例如:^$ —— 空字符串
s –> 匹配任意的空白符
w –> 匹配字母或数字或下划线或汉字
b –> 是正则表达式规定的一个特殊代码代表着单词的开头或结尾,也就是单词的分界处
d –> 匹配一位数字
W (大写) –> 匹配任意不是字母,数字,下划线,汉字的字符
S (大写) –> 匹配任意不是空白符的字符
D (大写) –> 匹配任意非数字的字符
B (大写) –> 匹配不是单词开头或结束的位置
“ . ” –> 匹配除了换行符以外的任意字符
“ * ” –> 它代表的不是字符,也不是位置,而是数量——它指定 * 前边的内容可以连续重复使用任意次以使整个表达式得到匹配。“ * ”连在一起就意味着任意数量的不包含换行的字符
“ + ” –> 是和“ * ”类似的元字符,不同的是 * 匹配重复任意次(可能是0次),而 + 则匹配重复1次或更多次。
“ ? ” –> 重复零次或一次
“ – ” –> 不是元字符,只匹配它本身,即连字符(减号)

3、举例说明
示例一:原固定链接/personal/article/%year%/%postname%.htm改为/%postname%.html
重定向语句:

RedirectMatch 301 ^/personal/article/([0-9]+)/(.*)$ /$2l

RedirectMatch 301 ^可以理解为语句正式开始,/personal/article/是原固定链接结构,非变量,([0-9]+)可以理解为对应/%year%/,(.*)可以理解为最后的文章名称或者ID,这2个变量分别可以赋予编号$1,$2,。(.*)和$2l之间的那个$可以理解为老网址和新网址之间的分割。

示例二:原固定链接/%year%/%monthnum%/%day%/%postname%/改为/%postname%.html
重定向语句:

RedirectMatch 301 ^/([0-9]+)/([0-9]+)/([0-9]+)/(.*)/$ /$4.html

RedirectMatch 301 ^可以理解为语句正式开始,中间三个([0-9]+)可以理解为分别对应%year%/%monthnum%/%day%,(.*)可以理解为最后的文章名称或者ID,这四个变量分别可以赋予编号$1,$2,$3,$4。(.*)和$4.html之间的那个$可以理解为老网址和新网址之间的分割。

我们要修改的,就是把地址中的日期全都不要了,只要第四部分的文章名,然后在文章名后面加上.html来实现伪静态

也就是说,那三个([0-9]+)都不要了,只要(.*)部分,而(.*)对应于$4,所以现在的网址只写上$4.html就行了,也就是以前的(.*).html

示例三:/%post_id%修改为/%category%/%post_id%.html
因为%post_id%肯定是数字,而上面说过,正则表达式中(d+)对应任意数字,所以以前的网址可以写成/(d+)
而%category%是分类,肯定是字符,不管是汉字还是字母,正则表达式中(.+) 对应的是任意字符(包括汉字、英文字母等),所以新的网址可以写成/(.+)/(d+).html
在原网址中,%post_id%即(d+)对应于$1,所以新网址为/(.+)/$1.html
然后用$将新旧网址连接起来,写成301重定向语句:
重定向语句:

RedirectMatch 301 ^/(d+)$ /(.+)/$1.html

4、该如何写自己的重定向语句

A:你要弄清楚自己的原网址每一部分是什么形式,数字?字符?然后分别用上面的正则表达式符号来对应,(.+) 对应的是任意字符(包括汉字、英文字母等),(d+)对应的是任意数字(仅仅是阿拉伯数字)
因为文章名称中可能含有字母,可能含有数字,所以要用(.*)来对应,(.*)表示任意的东西
B:将原网址每一部分分别对应,按照顺序,依次用$1/$2/$3/$4/$5来对应
C:写出新网址,按照写原网址的规则来写,不再累赘
D:用$来连接新旧网址,写成301重定向语句(新网址中与原网址相同的部分要用符号来代替,用$1、$2、·····来代替)
注意,$和后面的新网址之间有一个空格。而且,如果原网址最后有/的话,在$之前也必须有一个/

5、注意事项
WordPress会自动修改.htaccess文件中# BEGIN WordPress和# END WordPress之间的内容,即使你并没有修改过固定连接。只要点击了“固定连接”,.htaccess文件中# BEGIN WordPress和# END WordPress之间的内容就会被更改,自动还原。
因此,如果你要添加自己的语句而不被替换的话,将自定义的匹配规则写在.htaccess中的# BEGIN WordPress和# END WordPress之外即可。

参考文章:
http://lesca.me/archives/htaccess-rewrite.html
http://teddysun.com/182.html

5 comments

  1. 一般来说,直接安装WP Permalinks Migration插件就可以。

  2. 博主你好,我以前的固定连接是/%postname%.html 现在的是/%category%/%post_id%.html 可否告知下我这个的规则应该如何写?这个问题拖了好久了,百度收录一堆404,自己折腾老不对,请教朋友要么是不会要么是瞎扯淡,跟我说这2种无法转换。。先说声谢谢。

  3. 非常感谢,唯一一个帮上忙的教程……

  4. 谷歌反应最快,已经全部收录新地址。百度以新地址收录了新发的文章,已经收录的文章目前还没有变化,已经向百度站长平台提交了正则规则。

  5. 你301完固定链接后,Google、百度用了多久收录新地址?

Leave a Reply

Your email address will not be published. Required fields are marked *