好像从wordpress3.0以来,修改permalink(固定链接)不会导致旧链接失效。也就是说旧的链接仍然可以通过wordpress 301跳转到新的permalink页面。于是哪天当你发现自己的permalink不友好时或者发现更改后permalink还不理想又更改,却发现自己的旧链接并不像wordpress3说的那样会自动跳转到新的自定义链接上来,而是变成了404页面。下面说一下常见的跳转错误的解决办法(以下内容是针对wordpress3之后的版本)。
一、使用单个%postname%或者默认方式?p=id结尾
你的旧链接的结尾是一个单纯的结构标签,例如:
http://yourdomain.com/中间部分/日志名称,是以%postname%标签结尾
http://yourdomain.com/中间部分/?p=日志id,是以%post_id%标签结尾
而非多个标签复合,例如:
①http://yourdomain.com/中间部分/日志id_日志名称,是以%post_id%_%postname%复合标签后缀
或者含有自定义文字后缀,例如
②http://yourdomain.com/中间部分/日志名称.html,是以%postname%.html方式自定义链接
或者/后直接是id号,例如
③http://yourdomain.com/中间部分/日志id,是以/%post_id%方式自定义链接非默认的/?p=id
凡是自定义旧链接末尾使用的是单个名称标签或者默认的?p=id,wordpress3之后的版本会自动转向到你定义的任何形式的新链接,不需要你做任何多余的设置。如果没有自动跳转,请查看你的.htaccess里是否有以下rewrite代码
# BEGIN WordPress RewriteEngine On #RewriteBase根据wordpress目录是否是域名根目录而不同 RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # END WordPress
是否支持mod_rewrite模块,一般情况下,你保存新链接形式后,wordpress会自动更新.htaccess添加以上代码,如果没有则可能是权限问题,依次尝试给.htaccess的owner、group、world, 添加写权限,直到.htaccess可以自动更新,然后再把.htaccess权限改为660或664。
二、非单个名称标签结尾或者单纯/id结尾
如果旧链接的末尾有自定义后缀,如html或其他自定义字母后缀;两个结构标签复合而成;单纯的/id结尾(例子见第一点),这样格式的旧链接会直接跳转到404页面。解决方法有两种:
1.安装插件。
1.1如果你只改过一次链接,那么就用dean‘s migration 插件,使用的时候请注意先激活插件,设置旧链接格式,再保存一下新的固定链接。
1.2如果你很蛋疼有很多格式的旧链接,强烈推荐使用Permalink Redirec的最新版,当通过旧链接访问时就会触发这个插件,从而跳转到正确的链接。这个插件不仅支持多个旧链接格式的跳转还支持feeder跳转、域名跳转以及定义不进行跳转的链接。使用方法很简单,下载完最新版,上传到pluguin目录,激活插件,在下图红线框处输入旧链接的格式,保存,测试一下,所有的旧链接都搞定了。
2.修改.htaccess。
这个解决起来比简洁快速,就是弄正则式麻烦,打开你wordpress目录下的.htaccess,在“RewriteRule ^index\.php$ – [L]”下方添加自己的RewriteRule,下面是一些rewriterule例子
#把下面规则里目录修改为你的wordpress相对于域名的目录名称,如果是根目录用/ #1 旧链接的后缀和现在不同,例如以前是.htm,现在则是.html #1.1 以前的自定义结尾的结尾是单结构标签 RewriteRule ([\w-]+)\.htm$ /目录/$1 [R,L] #以前以/%postname%.htm结尾 RewriteRule ([0-9]+)\.htm$ /agon/?p=$1 [R,L] #以前以/%post_id%.htm结尾 #1.2 以前的自定义结尾是复合结构 RewriteRule ([0-9]+)-([\w-]+)\.htm$ /agon/?p=$1 [R,L] #以前以%post_id%-%postname%.htm方式结尾 RewriteRule -([0-9]+)\.htm$ /agon/?p=$1 [R,L] #以前以%postname%-%post_id%.htm方式结尾 #2 以前的自定义后缀和现在的相同,例如以前的是.html,现在还是html,这种情况需要根据前后两个链接格式的结构区别,写出更详尽的正则式,这个比较麻烦,下面给几个例子 #2.1 如果以前的是/%year%/%month%/%postname%.html,而现在最末端前面的/…/地址结构为非数字 RewriteRule [0-9]{4}/[0-9]{2}/([\w-]+)\.html$ /目录/$1 [R,L] #2.2 如果以前的是/%year%/%month%/%post_id%-%postname%.html RewriteRule [0-9]{4}/[0-9]{2}/([0-9]+)-([\w-]+)\.html$ /目录/?p=$1 [R,L] #2.3 如果以前的是/%year%/%month%/%postname%-%post_id%.html RewriteRule [0-9]{4}/[0-9]{2}/([\w-]+)-([0-9]+)\.html$ /目录/?p=$2 [R,L] #3 以单纯的/id结尾,如wordpress提供的archives/%post_id% RewriteRule [/]?([0-9]+)$ /agon/?p=$1 [R,L]
另外,如果你的博客的数据库折腾过很多次,可能会发现一个怪问题,一些涉及到id的跳转,一些跳转正确(尤其是刚发布的),一些没有跳转到先对应的日志(另一篇不同的日志),一些跳转到404页面,这种现象可能是数据库里wp_posts表的guid和id不相等,登录到phmyadmin,查看那些跳转错误的日志的guid和id是否相等,例如ID是5,guid却可能是/?p=4,只需使guid里的数字等于ID就可以正常跳转了。解决的办法是在phpmyadmin的sql里输入:
update wp_posts set guid = concat('http://www.yourdomain.com/?p=',ID) where post_status = 'publish' and post_type = 'post';
如果页面的跳转也有这种错误,那么输入:
update wp_posts set guid = concat('http://www.yourdomain.com/?page_id=',ID) where post_status = 'publish' and post_type = 'page';
至此,关于wordpress的旧链接跳转基本上就没什么问题了。
如果不记得以前的旧链接是什么结构,可以使用google的管理员工具的诊断->爬行错误里查看哪些链接引起错误的,更改完跳转设置,再访问这些链接看看是不是已经能跳转到正确的页面,如果错误,选择人以上合适的方法。
当然了最好不要随意改自己的链接结构,一开始就选择一个比较恰当的结构。首先从性能上说,为了提高页面载入速度,一般都要做静态化,推荐wp-super-cathe全站静态化,所以/%postid%/%postname%的结构没多大意义,尽量选择层次比较浅的结构,直接域名加日志名称,一般个人博客不会有几万篇日志,顶多几百篇,一个文件夹下放置这么多静态页面应该不会影响速度,另外最好给日志链接价格html结尾,据说搜索引擎偏好这个,所以推荐全站静态化,然后用%postname%.html结构链接。如果要加一个目录结构最好是数字性能好些,%year%相对好些,然而有争论说要加目录的话最好是/%category%/%postname%,说这个结构确实对seo有好处,然而如果还没想好目录最终的样式,更改分类名会使链接地址相应改变。关于加一级目录,请根据自己空间的实际情况选择。
我没有遇到过这样的情况。