WordPress 固定链接功能在各种平台上的配置方法
很多刚开始玩 WordPress的朋友一定对 WordPress 的永久链接很感兴趣,当然了,这个东西乍一眼看的确很新鲜,你想呀,发表文章啥的,空间里楞是没生成相应的目录或者 html文件,然后,就会有很多小盆友开始研究 WordPress 的永久链接,或者叫做固定链接,英文名就是那个 Permalink ,这里,我就来介绍一些WordPress 的永久链接原理、各个平台上的实现方法以及我推荐的几种永久链接形式。
一、原理
由于专业知识说起来很枯燥,所以我就很形象地来描述一下原理:
根据偶的观察,WordPress实现永久链接的方法如下,首先,访问者(就是你我)访问一个地址,比如:http://www.oicto.com/articles/
但是事实上并没有 /articles/ 这个目录呀,咋办捏?
这个时候 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.oicto.com/zhanz/20090622/58139.html 这种形式的特征是每篇文章都有扩展名(一般都喜欢.html)但是,有一个很容易被人忽略的弊端,页面还有分类的地址最后都少一个斜杠“/”,比如http://www.oicto.com/zhanz
而且 tag、date、author 等页面最后也是没有那个斜杠滴,可别小看这个斜杠,这个斜杠意味着一个目录,而没有斜杠则可能被搜索引擎认为是一个没有任何扩展名的文件而已,目录和文件,哪个权重比较大?反正在我印象中目录的权限比文件的权限大,而且目录更加美观,我一直这么觉得。
虽然可以认为加上个斜杠,而且不影响访问,但是这种类型的永久链接首先在搜索引擎收录上就吃了点亏,虽然以 cosbeta、Jason Ng 的名气,不用靠搜索引擎博客也会做大,但是我还是不推荐新手使用.html等带有扩展名的永久链接形式,除非你要使用江东开发的 cos-html-cache ,一般情况下真的不推荐使用。
另外一个容易被大家忽略的细节就是,不用扩展名但是最后少了一个斜杠,比如 看这个文章的地址:http://www.oicto.com/shuoit/kaixin 最后没有斜杠吧?虽然人为还是可以加一个的,但是在搜索引擎认为,这就是一个没有扩展名的文件而已,除非你有以上几位的名气,否则新人我真的不推荐使用带有扩展名的或者没有斜杠的永久链接形式。
那么,最好的永久链接形式是哪种呢?
我就推荐两种,假如你和我一样,喜欢每篇文章都加个 slug(就是传说中的 postname),那么我推荐你使用 /%postname%/
假如你很懒,那么我直接推荐你用 /archives/%post_id%/ 这样的,archives没有任何意义,可以自己修改成post或者留空都行
修改永久链接方法:后台 > 设置 > 永久(固定)链接