您可以分享到:
抽屉 QQ空间
网易微博 新浪微博
腾讯微博 人人网
Follow5
很多刚开始玩 WordPress 的朋友一定对 WordPress 的永久链接很感兴趣,当然了,这个东西乍一眼看的确很新鲜,你想呀,发表文章啥的,空间里楞是没生成相应的目录或者 html文件,然后,就会有很多小盆友开始研究 WordPress 的永久链接,或者叫做固定链接,英文名就是那个 Permalink ,这里,我就来介绍一些 WordPress 的永久链接原理、各个平台上的实现方法以及我推荐的几种永久链接形式。
一、原理
由于专业知识说起来很枯燥,所以我就很形象地来描述一下原理:
根据偶的观察,WordPress 实现永久链接的方法如下,首先,访问者(就是你我)访问一个地址,比如:http://zou.lu/back-home-2009/
但是事实上并没有 /back-home-2009/ 这个目录呀,咋办捏?
这个时候 WordPress 在设置好伪静态的情况下,就会请求 index.php 文件,然后通过层层关系,生成一个实际上并不存在但是可以访问的地址,伪静态就把 index.php 这个丑陋的字符给去除,这样的链接形式更符合Web 2.0的标准,而且更加美观。
对于详细的原理,在这篇文章《WordPress Rewrite / Permalink内部过程分析》里很详细地介绍了,有兴趣的童鞋可以自己查看。
二、在各个平台的主机下的实现方法
1、Apache
Apache 下首先要开启 mod_rewrite 模块(具体教程在这里有视频,点击这里下载)
一般是自己买空间的新手无需自己配置 Apache 的模块(除非自己购买服务器或者VPS),所以一般很多空间商会宣称支持rewrite 伪静态,实际上在 Apache 下开启了 mod_rewrite模块 后,只要在根目录下放一个 .htaccess文件 即可,默认情况假如你的 WordPress 根目录 可写,只要在后台设置永久链接就会自动生成一个 .htaccess 文件,假如没有生成,请直接用以下的代码:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule># END WordPress
用FTP保存为一个名为 .htaccess 的文件即可,然后放在你的 WordPress 的根目录,然后进入后台,设置 > 永久(固定)链接,选择自己喜欢的形式即可。
一般 Apache 的主机设置 WordPress 永久链接 没有成功的原因都是自己没有生成这个 .htaccess 文件或者空间商没有开启mod_rewrite 模块 ,解决起来也很简单,下面介绍的三种平台就相对麻烦了。
2、Nginx
我对 Nginx 了解不是很多,但是自己的 VPS 用的就是 Nginx,所以配置 WordPress 的永久链接还是很简单滴,因为原理是WordPress 是通过 index.php 来实现伪静态,所以和 Apache 下的伪静态规则类似,Nginx下就这段配置(一般加到 /usr/local/nginx/conf/nginx.conf 文件里):
if (!-e $request_filename) {
rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;
rewrite ^([_0-9a-zA-Z-]+)?(/.*.php)$ $2 last;
rewrite ^ /index.php last;
}
送上一段完整的配置代码(没有开启日志功能哦)
server
{
listen 80;
server_name xiamipan.com www.xiamipan.com *.xiamipan.com;
index index.html index.htm index.php;
root /web/www/public_html/xiamipan.com;#limit_conn crawler 20;
#location /status {
#stub_status on;
access_log off;
#}if (!-e $request_filename) {
rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;
rewrite ^([_0-9a-zA-Z-]+)?(/.*.php)$ $2 last;
rewrite ^ /index.php last;
}location ~ .*\.(php|php5)?$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}location ~ .*\.(js|css)?$
{
expires 1d;
}log_format xiamipan '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /web/logs/xiamipan.log xiamipan;
}
好人做到底,对于用了 WP Super Cache 的童鞋,在 Nginx 下也得配置一下伪静态,送上完整的代码:
server
{
listen 80;
server_name wp.showfom.com;
index index.html index.htm index.php;
root /web/www/public_html/wp.showfom.com;#limit_conn crawler 20;
#location /status {
#stub_status on;
access_log off;
#}
location /
{
autoindex off;
set $wp_super_cache_file '';
set $wp_super_cache_uri $request_uri;
if ( $request_method = POST )
{
set $wp_super_cache_uri '';
}
if ( $query_string )
{
set $wp_super_cache_uri '';
}
if ( $http_cookie ~* "comment_author_|wordpress|wp-postpass_" )
{
set $wp_super_cache_uri '';
}
if ( $wp_super_cache_uri ~ ^(.+)$ )
{
set $wp_super_cache_file /wp-content/cache/wp_super_cache/$http_host/$1index.html;
}
if ( -f $document_root$wp_super_cache_file )
{
rewrite ^(.*)$ $wp_super_cache_file break;
}
if (-f $request_filename)
{
expires 30d;
break;
}
if (!-e $request_filename)
{
rewrite ^(.+)$ /index.php?q=$1 last;
}
}location ~ .*\.(php|php5)?$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}location ~ .*\.(js|css)?$
{
expires 1d;
}log_format t '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
access_log /web/logs/t.log t;
}
(PS:server_name 后面的绑定域名 和 root 后面的所在目录需要修改成自己的,切记 Nginx 配置最重要的是最后几行的日志代 码,日志的 .log 文件必须存在,而且文件名和变量一样并且不能和其他站点重复)
3、IIS
IIS 平台虽然不利于 php (php 在 win平台 下只是一个模拟环境),但是还是有方法实现伪静态的,童鞋们可以参考这两种方法:
①、利用404.php
原理和 Apache 等其他平台一样,设置站点的 404 错误页面为这个404.php,当访问一个实际并不存在的地址时,就请求404.php ,然后……我就不说了,但是前提是你的空间能自定义错误页面(一定得用 php )
②、安装 IIS 的 ISAPI 组件
这种方法适合能自己管理服务器的童鞋或者和你的空间商搞好关系,要他们帮你安装个免费的ISAPI扩展,直接就可以使用 WordPress 的永久链接,无需设置其他,详情请参考《WordPress在Win-iis中的完美rewrite实现方法》,该扩展的下载地址在这里,这个方法理论上是最好的,但是也是要求最高的,首先需要服务器的管理权限,所以,尽量和你的空间商搞个好关系吧,安装好这个你还需要简单地修改一下 wp-includes/classes.php,详情参考这里
4、lighttpd
lighttpd 我没怎么用过,不过见到了不同版本的方法,使用 lighttpd 作为服务器的童鞋可以自己参考:《Lighttpd wordpress Permalink rewrite 办法》、《 lighttpd配置WordPress伪静态(固定链接)》、《lighttpd支持wordpress伪静态地址》
(PS:除了 lighttpd,其他的几个平台都是我亲自测试过,应该没啥鸟问题)
三、我推荐的 WordPress 永久(固定)链接形式
这个问题才是今天文章的关键,我得好好说说,自动看了东哥的《扫盲贴:wordpress永久链接格式建议 》一文,我就不得不说说我自己的看法了。
很多人会喜欢类似可能吧、生活点滴等永久链接形式,比如:http://www.storyday.com/html/y2009/2460_wordpress-ermalink.html 、 http://www.kenengba.com/post/1298.html 这种形式的特征是每篇文章都有扩展名(一般都喜欢.html)但是,有一个很容易被人忽略的弊端,页面还有分类的地址最后都少一个斜杠“/”,比如http://www.kenengba.com/post/category/%E4%BA%92%E8%81%94%E7%BD%91%E7%BB%9C
http://www.storyday.com/cat/internet
而且 tag、date、author 等页面最后也是没有那个斜杠滴,可别小看这个斜杠,这个斜杠意味着一个目录,而没有斜杠则可能被搜索引擎认为是一个没有任何扩展名的文件而已,目录和文件,哪个权重比较大?反正在我印象中目录的权限比文件的权限大,而且目录更加美观,我一直这么觉得。
虽然可以认为加上个斜杠,而且不影响访问,但是这种类型的永久链接首先在搜索引擎收录上就吃了点亏,虽然以 cosbeta、Jason Ng 的名气,不用靠搜索引擎博客也会做大,但是我还是不推荐新手使用.html等带有扩展名的永久链接形式,除非你要使用江东开发的 cos-html-cache ,一般情况下真的不推荐使用。
另外一个容易被大家忽略的细节就是,不用扩展名但是最后少了一个斜杠,比如 aw 的博客,看这个文章的地址:http://www.awflasher.com/blog/archives/1793 最后没有斜杠吧?虽然人为还是可以加一个的,但是在搜索引擎认为,这就是一个没有扩展名的文件而已,除非你有以上几位的名气,否则新人我真的不推荐使用带有扩展名的或者没有斜杠的永久链接形式。
那么,最好的永久链接形式是哪种呢?
我就推荐两种,假如你和我一样,喜欢每篇文章都加个 slug(就是传说中的 postname),那么我推荐你使用 /%postname%/
假如你很懒,那么我直接推荐你用 /archives/%post_id%/ 这样的,archives没有任何意义,可以自己修改成post或者留空都行
修改永久链接方法:后台 > 设置 > 永久(固定)链接
至于为什么搜索引擎里目录的权重比文件的权重要高,请参考这几篇文章:
(PS:因为本人很久大概一年没做过系统的SEO,所以只是以自己的经验和个人爱好来谈这个问题,请勿盲目跟从)
(再次PS:我发现自己越来越啰嗦,WordPress 永久链接我能讲上个三天三夜,囧……收手赶紧)


已有48条评论
kramon
发表于2009年07月11日00:18
晚了没?
kramon
回复:
July 11th, 2009 at 00:18
@kramon, 看来没晚,第二次沙发,我容易吗?
Showfom
回复:
July 11th, 2009 at 00:18
@kramon, 没晚,囧 老K你这啥速度……我刚发表完,修改了文章的时间 保证暑假每天一篇文章 哦哈哈
LAONB
发表于2009年07月11日00:18
板凳
Sunny
发表于2009年07月11日00:20
话说认识你以后,我的alexa上升很快
Showfom
回复:
July 11th, 2009 at 00:20
@Sunny, 偶人品好的缘故 偶的Alexa上升得太夸张了
siqianLee
发表于2009年07月11日00:20
都什么速度……
技术型的文章等博客搞定的再看
Showfom
回复:
July 11th, 2009 at 00:23
@siqianLee, 日 你不是明天飞机么?哦 不 是今天 还不早点去死
siqianLee
回复:
July 11th, 2009 at 01:35
@Showfom,
早上5点就得起,索性就不睡了
博译论
发表于2009年07月11日04:28
为什么要在代码中加入tag/wordpress之类的链接地址
Showfom
回复:
July 11th, 2009 at 14:20
@博译论, Simple Tags 自动完成的 呵呵 方便查找而已
zrqx008
发表于2009年07月11日07:18
额,想不到用手机留言尽然自动帮我填好了资料。话说文中有几个错别字,还得修改。我在Windows始终没配好Wordpress的环境。
Showfom
回复:
July 11th, 2009 at 09:51
@zrqx008, 用 phpnow 就直接配置好环境了呗 笨死了
托尔·银月
发表于2009年07月11日07:37
反正在我“影响”中目录的权限比文件的权限大,而且目录更加美观,我一直这么觉得。
亲爱的,是“印象”吧~~~~~~
Showfom
回复:
July 11th, 2009 at 09:35
@托尔·银月, 对对对 错别字
托尔·银月
回复:
July 11th, 2009 at 19:01
@Showfom, 错别字不影响永久链接~~~嘿嘿
章鱼
发表于2009年07月11日08:55
原来win主机也能啊
LAONB
发表于2009年07月11日09:51
下次发稿前,让我先到后台预览一遍,顺便帮你排查错别字。
内容很充实,难怪当时教我后面加个/
西风
发表于2009年07月11日11:16
网上整理 鉴定完毕
showfomMJJ 绝对真实
Showfom
回复:
July 11th, 2009 at 12:50
@西风, 日你妈的 都是自己打的 日
Jutoy
发表于2009年07月11日12:06
为啥我的直接在后台里设置就可以了…
Showfom
回复:
July 11th, 2009 at 12:49
@Jutoy, Apache 主机,国外的大多数空间都是直接在后台设置即可的~因为默认WordPress根目录权限是755 所以后台设置以后会自动更新.htaccess文件
huaimao
发表于2009年07月11日17:29
偶学习了!偶的就没有实现!
Bronco
发表于2009年07月11日18:24
路过~~我的Permalink用的是/%category%/%postname%/的形式~
话说guo.im是也是你的?
Showfom
回复:
July 11th, 2009 at 19:53
@Bronco, 额。。。被你发现了…… 用 /%category%/%postname%/ 也是一种不错的选择,我以前也这么用,后来觉得每次都带着分类不爽 哈哈
bolo
发表于2009年07月11日18:56
厉害啊,史上最详细的教程了
leecay
发表于2009年07月11日19:50
已经使用永久连接的飘过,呵呵~
shamas
发表于2009年07月12日10:05
半路上修改永久链接形式会不会影响以前收录的内容?
Showfom
回复:
July 12th, 2009 at 10:21
@shamas, 用 http://www.deanlee.cn/wordpress/permalinks-migration-plugin/ 这个 插件 就没事
万戈
发表于2009年07月12日10:09
本来以为是扫盲帖,没想到写的那么深入,越看越晕
Showfom
回复:
July 12th, 2009 at 10:21
@万戈, 我也觉得我越来越啰嗦了
万戈
回复:
July 12th, 2009 at 10:23
@Showfom, 需要的人总是用的着的,我是linux主机,永久链接方面没什么问题,所以就匆匆略过了~
mmdapei
发表于2009年07月12日12:09
飘过……
sharktime
发表于2009年07月13日12:01
不错不错
aunsen
发表于2009年07月15日09:29
总结的太好了!留存备用!
Qing
发表于2009年07月15日09:36
一切url地址都是虚的
marslau
发表于2009年07月17日10:10
总结的太全面了,很费心啊
tangzhehao
发表于2009年10月5日11:45
我用的是Nginx。
Mc
发表于2010年07月5日23:01
博主你好,我用的是二级目录。博客放在类似 /www/blog/ 这样的目录下,请问伪静态如何写呢。
black lebron james shoes
发表于2010年08月24日14:04
哎,这个有点难度了
Trackbacks