Skip to main content

最近在折腾Windows VPS,并且使用IIS 7搭建了网站。使用Wordpress一般都会启用伪静态,wordpress自带IIS的伪静态规则,但是被我发现了一个很严重的问题,那就是URL Rewrite不支持中文,这样中午的标签和中文的分类目录(没指定别名)点击后就会404了。
在网络上搜索了一阵后终于找到了一个比较完美的方案,因为传播比较广,已经找不到原作者了,但还是向原作者表示感谢。

1.创建chineseurl.php文件

首先我们要在Wordpress安装目录下创建chineseurl.php文件,为下一步做准备。

文件内容如下:

<?php

// IIS Mod-Rewrite
if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
	$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
}
// IIS Isapi_Rewrite
else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
	$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
}
else
{
	// Use ORIG_PATH_INFO if there is no PATH_INFO
	if ( !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']) ) {
		if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] )
			$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];
		else
			$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];
	}

	// Append the query string if it exists and isn't null
	if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
		$_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
	}
}

require("index.php");

?>

2.配置web.config文件

web.config文件是IIS 7中网站的额外配置文件,当然伪静态规则也是写在这里的。
在使用伪静态前先检查下有没有安装URL Rewrite模块,如果没有安装是无法使用的。

如果文件夹下没有web.config文件,最好是使用wodpress生成一下配置文件。即“设置-固定链接”不用修改直接保存就好了。

生成后在web.config中

<rewrite><rules>....</rules></rewrite>

中的

<rule name="wordpress" patternSyntax="Wildcard">

插入专门的中文重写规则即可:

<rule name="ChineseURL" stopProcessing="true">
    <match url="^(tag|category)/(.*)$" />
    <action type="Rewrite" url="chineseurl.php" />
</rule>

插入完成后应该是像这样:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
            <rule name="ChineseURL" stopProcessing="true">
                <match url="^(tag|category)/(.*)$" />
                <action type="Rewrite" url="chineseurl.php" />
            </rule>
            <rule name="wordpress" 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>

保存即可生效,现在再点击中文标签试试?不会404了吧!

小结

此方法比较完美地解决了IIS7中文标签、分类目录显示404的问题,原理其实就是如果匹配到url中有category或tag的话转向到chineseurl.php处理。
其中chineseurl.php其实也就是很简单地修改了get头信息以来解决404的问题。虽然代码简单,但是实现地很完美,而且就算wordpress升级了也不会再次出现404问题了,有这个问题的网站还是推荐使用的

Hintay

帝王鸽

1 条评论

发表评论

表情 图片 粗体 删除线 居中 斜体 下划线 段落引用 代码