2011-08-12

IIS7+Web.Config的WordPress中文URL解决方案

0

早前也写过一些如‘WordPress 中文 Tag 链接问题解决方案’、‘IIS 下实现 WordPress 伪静态’等IIS下的伪静态及中文Tag解决方案,在IIS7中支持的Web.Config伪静态可以完美地用下面的方法解决中文URL的问题。

Windows IIS7 虚拟主机对包含中文的 URL 支持有问题,特别是国外的 Windows 主机,如 Godaddy 主机等。这时访问包含中文的 URL 就会出现找不到该页的 404 错误。

注:由于 Typecho 与 WordPress 伪静态相对一致,该方法也能完美解决 Typecho 中文 Tag 无法访问的问题。

通过增加一个 PHP 文件,并修改一下 Web.Config 文件中的 Rewrite 规则即可。

1、增加文件: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");
?>

2、修改或建立 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="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>

3、将 cnurl.php 和 Web.Config 上传至网站根目录即可。