首页 建站WordPressWordPress技巧通过ISAPI Rewrite设置WordPress的固定链接

通过ISAPI Rewrite设置WordPress的固定链接

  Wordpress默认的连接形式是 www.domain.com/?p=1 这样的格式, 第一次设置Wordpress的固定链接是在Win的主机上,我发现只能将其设置为类似 /index.php/%post_id% 这样的伪静态格式。这个index.php让人看上去很不舒服,在Apache下就可以直接使用 /%post_id% ,原因是Wordpress可以自动配置.htaccess文件,在WP后台修改完配置以后WP目录的.htaccess文件多了如下字段:

# BEGIN WordPress
<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

  Wordpress自动为我们配置好了规则。

  Windows的IIS平台不支持.htaccess文件,.htaccess文件是Unix、Linux和Apache服务器所支持的配置文件,而国内大多数都为Windows的平台。给WordPress设置固定链接,几乎是刚刚开始接触WordPress的童鞋首先遇到的问题。一个漂亮的URL除了“有利于搜索引擎收录”以外,看起来也不那么别扭。使用apache服务器的博主只需要借助WordPress自身的“固定链接”设置工具便可以自动生成.htaccess文件,而对于我这种使用Windows主机的用户来说则需要手动配置了。那么为了使用更友好的固定链接的形式,我们必须借助一个叫做Rewrite的组件,他是一个URL重写组件,大部分Windows主机都支持这个组件。利用它可以实现类似.htaccess的功能。在Windows的IIS(Internet Information Server)上,借助Rewrite以实现URL转发功能。从而实现伪静态,

  什么是伪静态?伪静态从名字来看它是假的静态,不是真的静态。那么什么是真的静态呢?这个做过网站的朋友都知道静态页面和动态页面的区别。静态页面通常是一个.html或者.htm的文件,而动态页面通常是.asp,.php,等等的程序文件,后面跟一个查询字符串(querystring)。因为WordPress不支持生成静态页面,所以WordPress发表的文章地址类似于 http://yourdomain/?p=115,或者http://yourdomain/index.php?word,的形式。经过伪静态以后可以让这些动态地址看起来类似于http://yourdomain/115.html,和http://yourdomain/word.html,这样看起来更像是一个静态站,而当你输入一个静态地址实际映射到动态的地址,这也就是前面所说的URL重写了。Rewrite组件的使用方法是在根目录新建一个httpd.ini的配置文件,文件可以参照下面的内容,Rewrite实现伪静态的语法是这样的:

RewriteRule    正则表达式1   正则表达式2

  其中正则表达式1用于过滤出源URL,正则表达式2是重写后的URL,例如下面这个例子:

RewriteRule example.html abc.asp

  这样当你在浏览器输入example.html的时候实际上访问的是abc.asp。

  长话短说,下面就直接给出WordPress可以直接使用的Rewrite规则:

RewriteRule /sitemap.xml /sitemap.xml [L]
RewriteRule /favicon.ico /favicon.ico [L]
RewriteRule /(.*)\.php(.*) /$1.php$2 [L]
# For file-based wordpress content (i.e. theme), admin, etc.
RewriteRule /wp-(.*) /wp-$1 [L]
# For normal wordpress content, via index.php
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]

  这个是我目前在用的规则,如果看不明白,可以问问度娘什么叫“正则表达式”?这个规则有点重复和繁琐。下面再发一个我精简过的规则:

RewriteRule /(.*)\.(.*)\?(.*) /$1.$2\?$3 [l]
RewriteRule /(.*)\.(.*) /$1.$2 [L]
RewriteRule /(.*)/(.*) /$1/$2 [L]

  一共只有三条。如果你不打算设置类似http://yourdomain/1.html的固定链接,而是用类似http://yourdomain/1,这样的形式(总之不能有那个“.”)这个规则很适合你,简单、明了、不影响子目录。缺点是固定链接中不能带有点。

  引伸出的问题:RewriteRule /(.*) /index.php/$1 这么一条规则使得任何域名后的字符都被传递给了index.php,这样404错误实际由index.php来控制,而RewriteRule /(.*)\.(.*) /$1.$2  这样的规则会导致一旦找不到页面则不会跳转到WordPress的404错误页面,会直接由IIS提供。而且不论用何种方式,貌似对子目录的兼容性都不是很好,因为WordPress固定连接的目录是虚拟出来的,很难保证不和虚拟主机的物理目录发生冲突。因此强烈建议不要在WordPress启用固定链接以后用同一个空间的子目录做其他站点。

  说到这里其实第一组发布的规则易用性最好,美中不足如果在地址栏输入http://yourdomain/*.php的时候假设不存在这个文件仍然会提示IIS的404页面而不是WordPress的。最完美的办法就是为根目录的每一个文件写一条规则,比如RewriteRule /sitemap.xml /sitemap.xml,有多少个文件就写多少个文件。这样做以后绝对不会出现跳转到IIS的404页面的情况。一旦上传了新文件,一定记得添加规则,不然会出现找不到文件的情况。

  把编辑好的RewriteRule保存为httpd.ini并放在虚拟主机的根目录,大功告成。最后不要忘了去WordPress的固定链接设置页面选择你喜欢的样式。“固定链接”设置页面一共有六个按钮:

20130718012638

 

  上图中一共有6个单选按钮,点击不同的按钮就可以看到不同的标签,例如/%year%/%monthnum%/%postname%/分别代表年\月\文章名称。你可以自由组织这些标签,或者加上你自己的内容,例如我博客的设置:

https://www.mazhiyuan.com/%postname%.html

  这也是你现在看到的我博客地址栏的效果。

  最后,附上完整版的Rewrite规则,复制文本后保存为文本文件并更改文件名为“httpd.ini”,然后放在你空间的根目录:

[ISAPI_Rewrite]

# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32
# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
# Rules to ensure that normal content gets through

#定义根目录的文件可访问
RewriteRule /favicon.ico /favicon.ico [L]
RewriteRule /robots.txt /robots.txt [L]
RewriteRule /sitemap.xml(.*) /sitemap.xml$1 [L]
RewriteRule /sitemap.xml.gz /sitemap.xml.gz [l]
RewriteRule /sitemap_baidu.xml(.*) /sitemap_baidu.xml$1 [L]
##这个xmlrpc.php用于第三方软件例如Windows live writer与WordPress通信
RewriteRule /xmlrpc.php(.*) /xmlrpc.php$1 [L]

# For file-based wordpress content (i.e. theme), admin, etc.
RewriteRule /wp-(.*) /wp-$1 [L]
# For normal wordpress content, via index.php
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]

############备用#############
#使能够访问根目录的php文件并传递参数
###RewriteRule /(.*)\.php(.*) /$1.php$2 [L]
#使能够访问根目录所有类型的文件并传递参数
#RewriteRule /(.*)\.(.*)\?(.*) /$1.$2\?$3 [l]
#是能够访问根目录的所有文件但不传递参数
#RewriteRule /(.*)\.(.*) /$1.$2 [L]

#支持除了WordPress以外的其他子目录的访问
RewriteRule /(.*)/(.*) /$1/$2 [L]

  至此,大功告成。