这篇文章上次修改于 224 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

继上文,博客搬迁完成后,由于新的虚拟主机使用的是windows的服务器,Windows sever2012与IIS8.5对中文url存在兼容性问题,因此如果url中带有中文,就会导致错误,这就直接导致了typecho分类中带有中文标签和使用搜索功能搜索中文内容,就会跳转到404错误页面。解决方法就是对typecho启用伪静态,也就是地址重写功能。
在typecho控制台——设置——永久链接中启用地址重写功能,提示
ccd747b9762c93433d1e63c3512d57bc90e272ae.jpeg
这种情况一般就是主机没有设置伪静态功能,因此无法开启伪静态,但是,我们可以通过另一种方式手动添加伪静态规则,以达到开启伪静态的目的:
在typecho的根目录建立一个名为Web.Config的文件,内容为:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
          <rules>
            <rule name="cnUrl" stopProcessing="true">
              <match url="^(tag|category)/(.*)$" />
              <action type="Rewrite" url="cnurl.php" />
            </rule>
            <rule name="typecho" patternSyntax="Wildcard">
              <match url="*" />
                <conditions>
                  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
              <action type="Rewrite" url="index.php" />
            </rule>
          </rules>
        </rewrite>
    </system.webServer>
</configuration>

这样,就能将index.php重写为伪静态的地址

接下来,在根目录下建立一个名为cnurl.php的文件,内容为:

<?php
if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
    // IIS Mod-Rewrite
    $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
} else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
    // IIS Isapi_Rewrite
    $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
} else {
    // Use ORIG_PATH_INFO if there is no PATH_INFO
    (!isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO'])) && ($_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO']);
    // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)
    if (isset($_SERVER['PATH_INFO'])) {
        ($_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME']) ? ($_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO']) : ($_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO']);
    }
    // Append the query string if it exists and isn't null
    (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) && ($_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']);
}
require("index.php");
?>

两个文件建立完成之后,再次进入控制台——设置——永久链接中启用地址重写,在检测失败提示下勾选仍然启用地址重写,就能成功启用伪静态功能。启用伪静态后,url中文的bug(以搜索中文关键词为例)也得到了修复:

<code>_W_JP51R6@</code>51E115@_ECQ.png

另外,原先的文章地址看上去也不再有一个index.php路径,看上去更像是一个静态页面:
I7ZALZNS_QL6@YQ~6~G8L_8.png

这样对搜索引擎也更加友好,一举双得。

附:
linux系列服务器强制开启伪静态可复制以下代码:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

将文件重命名为.htaccess,上传至网站根目录即可。


备注:解决typecho搜索中文出错的方法。