在Windows虚拟主机IIS下使用ISAPI Rewrite 3组件实现wordpress完美伪静态固定链接

一个好的网站,同样需要完善的搜索引擎优化(SEO)。对于WordPress博客来说,使用伪静态固定链接可以明显提高搜索引擎的亲和度。而对于Windows IIS主机来说,由于缺少Apache下的mod_rewrite,生成的伪静态固定链接不仅地址丑陋(含有index.php),而且对于自定义页面支持也不是很好(出现404错误)。Maple枫主站正是架在IIS虚拟主机上的,今天花了一下午的时间尝试了各种方法,解决伪静态固定链接问题,最终效果比较完美(本页面地址是https://www.maplefeng.com/archives/article-213.html,还是挺漂亮的~)。由于主机条件限制,一些好的方法不能够使用。下面就对目前比较主流的解决方案结合自己的经验做一个介绍。

方法一:使用404页面

原理:将404链接转向到一个php文件,php文件再指向正确的地址
实现方法:
1. 编写404.php页面,上传404.php文件放到wordpress根目录下,代码如下

<?php
if (strpos($_SERVER["SERVER_SOFTWARE"], "Apache") === 0) {
    // Apache
    // REQUEST_URI形如"/non-exist-page.html"
    $uri = $_SERVER['REQUEST_URI'];
} else {
    // IIS
    // $_SERVER['QUERY_STRING']形如"404;http://localhost/non-exist-page.html"
    $qstr = $_SERVER['QUERY_STRING'];
    $_SERVER['QUERY_STRING'] = "";
    $pos = strrpos($qstr, '://');
    $pos = strpos($qstr, '/', $pos + 4);
    $uri = substr($qstr, $pos);
}
$_SERVER['REQUEST_URI'] = $uri;
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
// 解决重定向的页面中的页面导航问题
$_SERVER['SCRIPT_NAME'] = $_SERVER['PATH_INFO'];
include ('index.php');
?>

2. 将404页面转向wordpress根目录下的404.php
3. 在wordpress后台开启固定链接链接
至此,固定链接设置完成

优点:方法简单,一劳永逸
缺点:404转向后,会导致访问不存在的文件时,也被指向404.php,造成返回页面错误。部分主机不支持动态404。

方法二:使用web.config实现.htaccess的功能

IIS是不支持.htaccess的,不过我们可以在IIS7中使用。安装后打开WordPress文件夹下的web.config,添加下面的规则到 system.webServer节点:

<rewrite>
    <rules>
        <rule name="Main Rule" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll">
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            </conditions>
            <action type="Rewrite" url="index.php/{R:0}" />
        </rule>
    </rules>
</rewrite>

方法三:使用ISAPI Rewrite组件

这种方法是最完美,不过也是最麻烦的一种方法。通过ISAPI Rewrite组件,可以模仿mod_rewrite组件的行为。不过由于免费版ISAPI Rewrite只能在httpd.ini中设置转向,因此搭建的过程比较麻烦,而且在增加页面时还要调整httpd.ini。这种方法也正是笔者选择使用的方法。下面对这种方法的实现步骤进行一下介绍。

1. 配置ISAPI Rewrite组件。若使用自己的主机,可以在网上ISAPI Rewrite 3 Lite并安装,然后配置ISAPI。具体的方法在网上能够找到很多教程,在此就不介绍了。若使用虚拟主机,可以联系主机提供商客服,请他们帮忙安装ISAPI Rewrite组件,客服会告知httpd.ini的位置,进行修改即可。

2. 编写httpd.ini。这个就需要一些时间和技术了。在此提供一个样例:

[ISAPI_Rewrite]
RewriteRule /post/tag/(.*) /index\.php\?tag=$1
RewriteRule /tag/(.*) /index\.php\?tag=$1
RewriteRule /(about|link|tags|sitemap|page|guestbook|friendly) /index\.php\?pagename=$1
RewriteRule /post/category/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed\.php\?category_name=$1&feed=$2
RewriteRule /post/category/?(.*) /index\.php\?category_name=$1
RewriteRule /author/(.*)/(feed|rdf|rss|rss2|atom)/?$ /wp-feed\.php\?author_name=$1&feed=$2
RewriteRule /author/?(.*) /index\.php\?author_name=$1
RewriteRule /feed /index\.php/\?feed=rss2
RewriteRule /rss.xml /index\.php/\?feed=rss2
RewriteRule /comments/feed /index\.php/\?feed=comments-rss2
RewriteRule /([0-9]+)/?([0-9]+)?/?$ /index\.php\?p=$1&page=$2
RewriteRule /post/([0-9]+)/?([0-9]+)?/?$ /index\.php\?p=$1&page=$2
RewriteRule /post/([0-9]+).html /index\.php\?p=$1 [I]
RewriteRule /page/(.*)/?s=(.*) /index\.php\?s=$2&paged=$1
RewriteRule /page/(.*) /index\.php\?paged=$1
RewriteRule /post/date/([0-9]{4})([0-9]{1,2})([0-9]{1,2})/([^/]+)/?([0-9]+)?/?$ /index\.php\?year=$1&monthnum=$2&day=$3&name=$4&page=$5
RewriteRule /post/date/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ /index\.php\?year=$1&monthnum=$2&day=$3&page=$4
RewriteRule /post/date/([0-9]{4})/([0-9]{1,2})/?$ /index\.php\?year=$1&monthnum=$2&page=$3
RewriteRule /post/([0-9]+).html/(feed|rdf|rss|rss2|atom) /index\.php\?feed=rss2&p=$1
RewriteRule /post/([0-9]+).html/trackback /wp-trackback\.php\?p=$1
# For file-based wordpress content (i.e. theme), admin, etc.
RewriteRule /wp-(.*) /wp-$1 [L]

每个站由于情况不同,需要自己进行定制。具体编写方法请参考RewriteRule的编写规则(笔者对此不是很精通,仅仅是根据样例,编写了自己的规则)。笔者建议的编写方式是,首先在后台中设置固定链接,此时访问站点中的页面会出现404错误,这说明这个页面需要rewrite,然后在httpd.ini中进行配置。

其中要注意,在RewriteRule /(about|link|tags|sitemap) /index\.php\?pagename=$1这部分,每当增加一个页面,都要把页面的别名添加到括号里,并且用|分隔。

上边给出的样例的自定义结构是这样的:/post/%post_id%.html。跟据需求,可以同时修改自定义结构和httpd.ini。

Comments (0)

Be the first to leave a reply!

Add Your Comment

* required

This is a unique website which will require a more modern browser to work!

Please upgrade today!