<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>技术相关</title>
		<link>http://www.reynaldliu.net/category/skill/</link>
		<description>《洗心改命》：重构人生的另一种可能</description>
		<copyright>Powered by SaBlog-X. Copyright (C) 2003-2010.</copyright>
		<generator>SaBlog-X Version 2.0 Build 20100301</generator>
		<lastBuildDate>Sun, 05 Sep 2010 09:04:10 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<link>http://www.reynaldliu.net/archives/12/</link>
			<guid>http://www.reynaldliu.net/archives/12/</guid>
			<title>isapi_rewrite3.1完整功能破解无限日期支持proxy反向代理带中文手册</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	可以用于iis中的wordpress,wp的url重写。并且是完整功能的。没有45天限制。lite版则不能用代理,location,等功能。</p>
<p>
	先安装官方文件，再用复盖补丁文件夹下所有文件替换。替换时提示拒绝访问则需要先停止iisadmin。</p>
<p>
	开始,运行</p>
<p>
	net stop /y iisadmin</p>
<p>
	再进行复盖。如果复盖时还提示拒绝访问，也可以全选把原来安装文件夹的文件便删除再复制复盖。复盖完成后。</p>
<p>
	net start iisadmin</p>
<p>
	net start w3svc</p>
<p>
	net start ftpsvc</p>
<p>
	即完成了破解。虽然还是会提示使用期限到了或过期，并且过期时间是负数，但是不会像没有破解前一样弹出一个确定框禁止访问。</p>
<p>
	另外破解后需要手工编辑httpd. conf。因为编辑按钮是灰色的不能按了。但是不影响功能使用。</p>
<p>
	下载软件<a href="http://www.reynaldliu.net/attachment.php?id=4" title="解除日期限制.rar&#13;&#13;大小:3.73 M, 下载次数:57" target="_blank">解除日期限制.rar</a></p>
<p>
	<b>第一章：软件介绍</b><br />
	ISAPI_Rewrite 是一款适用于IIS的功能强大的基于正则表达式的URL处理模块。它兼容Apache的mod_rewrite的语法，从而使仅仅复制.htaccess文件就把配置从appach移植到IIS中或者从IIS移值到appach中变成可能。请参阅3.2兼容性图表这一节。<br />
	ISAPI_Rewrite最重要的功能：<br />
	ISAPI_Rewrite提供了和Apach mod_rewrite相同的句法和行为，使仅仅拷贝.htaccess文件就完成配置移植成为功能。(要想阅读更多关于与mod_rewrite的兼容性，请参阅3.2兼容性图表这一节。)<br />
	正则表达式支持灵活而强大的配置。<br />
	极速而且容易升级的纯C++代码。<br />
	真正的分布式配置：实时监控服务器全局级别、虚拟主机（网站）级别、目录级别的.htaccess文件。<br />
	隔离性：用户级配置只影响本地用户环境，从而使ISAPI_Rewrite成为Web主机提供商的理想解决方案。<br />
	<b>重要的应用示例：</b><br />
	搜索引擎优化。<br />
	一台Web服务器的代理内容经过另一台web服务器。<br />
	防止内容被吸血（盗链）。<br />
	阻断特定主机、反向链接或者烦人的搜索机器人。<br />
	内容商议：向不同的语言用户或者不同的浏览器用户提供不同的文件。示例<br />
	为群集式服务器架构模拟负载均衡。<br />
	<b>定价资料</b><br />
	45天的试用期<br />
	单机版99美元<br />
	ISAPI_Rewrite精简版是免费的。在这里可以看到受限的细节说明。<br />
	大宗采购可议折扣。</p>
<p>
	<b>2.1系统要求</b><br />
	ISAPI_Rewrite可以被安装在下列操作系统中：<br />
	Windows 2000 with IIS 5<br />
	Windows XP with IIS 5.1<br />
	Windows Server 2003 with IIS 6.0<br />
	Windows Vista with IIS 7.0<br />
	Windows Server 2008 with IIS 7.0<br />
	在安装ISAPI_Rewrite之前，操作系统中必须先安装IIS。<br />
	32位和64位的Windows版本都是支持的，但是你必须下载32位版和64位版两种不同的安装包。Windows Installer 2.0必须运行安装程序。你可以从微软的网站上下载到最新版本的Windows Installer。<br />
	在Windows Vista和Windows Server 2008上安装ISAPI_Rewrite，还必须先安装下面两个模块(默认情况下这两个模块是不安装的)<br />
	ISAPI过滤器<br />
	ISAPI 扩展</p>
<p>
	<b>2.2安装程序</b><br />
	在运行安装包之前请先阅读系统要求部分。下载并安装某个版本的ISAPI_Rewrite.msi，依照安装向导的说明操作。安装过程是自动的，并有自我描述。ISAPI_Rewrite在自动安装过程中必须重启IIS。下列服务必须被重启：IISADMIN、W3SVC。不需要手工把任何ISAPI筛选器或者扩展加入到网站或者全局列表中。它能够在安装和配置过程中自动完成。<br />
	命令行安装<br />
	ISAPI_Rewrite也能够通过命令行进行后台安装。请使用以下命令行语法来安装：</p>
<pre>
msiexec /i ISAPI_Rewrite3.msi /qn AcceptEULA=Yes REGISTRATIONCODE=Code 
REGISTRATIONNAME=Name
</pre>
<p>
	用命令行来后台反安装ISAPI_Rewrite请使用下面的语法：</p>
<pre>
msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes</pre>
<p>
	<b>2.3手工安装</b><br />
	要手工安装ISAPI_Rewrite的话，你必须下载不同的手工安装包包含所有必须的文件。ISAPI_Rewrite精简版不支持手工安装。你可以安装全部功能或者仅仅安装它们中的一部分。<br />
	手工安装包包含下列文件：<br />
	ISAPI_Rewrite.dll - 这是ISAPI筛选器本身。<br />
	ISAPI_RewriteProxy.dll - 这是为代理操作的ISAPI扩展模块必不可少的。<br />
	license.rtf - EULA的产品许可证。<br />
	ISAPI_Rewrite.chm - .文档文件。<br />
	httpd.conf - 全局配置文件示例。<br />
	安装ISAPI_Rewrite，首先你必须在你在IIS系统中注册ISAPI_Rewrite.dll作为ISAPI筛选器。按默认ISAPI_Rewrite.dll文件是用来作为全局ISAPI筛选器的。而且它还能够被安装到某个特定的网站里，你需要记住在同一时间段里只有一个ISAPI_Rewrite.dll实例能够加载到一个IIS工作进程里，这意味着如果你决定把ISAPI_Rewrite的ISAPI筛选器单独地安装到每个站点里的话，你必须把这些站点切换高隔离模式，从而为这些网站产生独立的工作进程。如果你需要在每个站点上分别安装ISAPI_Rewrite，我们通常会建议改为在整个IIS上全局地安装它。<br />
	在Window 2000,Window XP 和Windows Server 2003中注册ISAPI 筛选器，无论是整个IIS服务器要用它还是个别WEB网站要用它，都要用IIS 的MMC管理单元来把ISAPI_Rewrite.dll添到ISAPI筛选器列表。在Windows Vista和Windows Server 2008中首先你需要安装可选IIS组件：万维网服务、应用程序开发功能、ISAPI筛选器。<br />
	如果你需要代理服务器功能，你还需要将ISAPI_RewriteProxy.dll注册为ISAPI扩展来侍服文件扩展名&ldquo;*. rwhlp&rdquo;。在不同的IIS版本中要求不同的操作。请参阅你管理的IIS版本的文档来了解如何注册一个新的ISAPI扩展并把它映射到IIS系统的文件扩展名上。在Windows Vista和windows server 2008首先必须安装可选的IIS组件：万组网服务、应用程序开发功能、ISAPI筛选器。使用短路径名（8.3模式）作为ISAPI_RewriteProxy.dll的模块路径，如果路径里有一个空格字符，IIS载入这个模块时将失败。<br />
	把httpd.conf文件放在ISAPI_Rewrite.dll文件的同一目录下并编辑它。<br />
	把下列两行内容放到httpd.conf文件中以注册ISAPI_Rewrite 产品：</p>
<pre>
RegistrationName=Your registration name
RegistrationCode=REG-CODE-PROVIDED-FROM-HELICON</pre>
<p>
	依照&ldquo;运行ISAPI_Rewrite的权限需求&rdquo;这一部分的说明来检查文件系统权限。</p>
<p>
	<span style="font-size: 14pt"><b>2.4反安装</b></span><br />
	反安装程序会删除所有安装程序所生成的文件、从管理元库中注销筛选器，并删除所有由安装程序所添加的其它管理元库变化。如果用户决定在反安装过程中保留用户文件的话，下列用户数据文件在反安装后会被留下来。</p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				文件名</td>
			<td>
				说明</td>
		</tr>
		<tr>
			<td>
				Program Files/Helicon/ISAPI_Rewrite/httpd.conf</td>
			<td>
				用户规则的主配置文件</td>
		</tr>
		<tr>
			<td>
				Program Files/Helicon/ISAPI_Rewrite/error.log</td>
			<td>
				包含错误日志的文件</td>
		</tr>
		<tr>
			<td>
				Program Files/Helicon/ISAPI_Rewrite/rewrite.log</td>
			<td>
				包含重写日志的文件</td>
		</tr>
		<tr>
			<td>
				.htaccess (various folders)</td>
			<td>
				用户创建的含有规则的配置文件</td>
		</tr>
	</tbody>
</table>
<p>
	&ldquo;删除用户创建的文件&rdquo;的选项在将反安装过程中提供给用户。如果启用这个选项则卸载程序也将删除位于Program Files文件夹里用户创建的文件。 .htaccess文件不会被删除。<br />
	要用命令行后台卸载ISAPI_Rewrite，请使用下面的语法：</p>
<pre>
msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes</pre>
<p>
	<span style="font-size: 14pt"><b>2.5运行ISAPI_Rewrite所需的权限</b></span><br />
	在一个干净的默认Windows系统上自动安装ISAPI_Rewrite不要求任何权限调整。但是一些其它产品比如说Plesk、IIS锁定工具的安装，等等，可能收紧服务器的安全性，并妨碍ISAPI_Rewrite的正常运行。下面是ISAPI_Rewrite的权限需求的列表单子：<br />
	在Windows 2000、Windows XP和Windows 2003的IIS5兼容模式下，筛选器运行在<b><i>System</i></b>帐户下的inetinfo.exe进程中。那个<b><i>system</i></b>帐户至少得被授予放置ISAPI_Rewrite安装文件的那个文件夹的&ldquo;<b>读取</b>&rdquo;和&ldquo;<b>目录浏览</b>&rdquo;的权限。我们还建议给予<b><i>system</i></b>帐号对这个文件夹的一般修改权。这将允许生成一些包含解析或者其它错误的文件。<b><i>system</i></b>帐号还必须在任何包含了.htaccess文件的网站文件夹里同样被授予这些权限，否则ISAPI_Rewrite将不能加载并监视它。<br />
	请稍留意ISAPI_Rewrite安装目录上的任何一点<b>拒绝</b>权限设置，因为在Windows 操作系统中，<b>拒绝</b>权限优先于任何<b>允许</b>权限记录。<br />
	在Windows 2003的天然IIS模式(WPI模式)以及Windows Server 2008中，无论是筛选器还是代理服务都运行在每个网站相应的运行程序池的w3p.exe工作进程中，每个应用程序池都可以使用它自己的定制来配置，这可能使权限设置成了一种复杂的工作。然而，在一个正确的IIS配置中，每个使用中的定制必须是<b><i>IIS_WPG</i></b>组的一个成员。因此，<b><i>IIS_WPG</i></b>组可以被用来代替<b><i>System</i></b>帐号去分配前面所写的权限需求。<br />
	在Windows Vista 中权限配置是和Windows 2003的配置差不多的，只是它没有<b><i>IIW_WPG</i></b>组。所以，所有的WPI帐号（一般Network Service是它的惟一帐号）都必须授予上述必需权限。<br />
	此外，为了让代理服务功能能工作，你必须在网站属性或者运行代理服务的web应用程序的属性中给予一个&ldquo;纯脚本&rdquo;的执行权限。</p>
<p>
	<b>2.6MSI的自定义行为自定义行为 </b><br />
	<span style="color: #ff80ff"><br />
	</span></p>
<table>
	<tbody>
		<tr>
			<td>
				<b>自定义行为</b></td>
			<td>
				<b>说明</b></td>
		</tr>
		<tr>
			<td>
				WiseAltStartup<br />
				自动智能启动</td>
			<td>
				为运行在延时模式中的自定义行为保存属性的当前状态。<br />
				使用一个可执行文件(dll)<br />
				发生在：安装、反安装。</td>
		</tr>
		<tr>
			<td>
				WiseCleanup<br />
				智能清理</td>
			<td>
				这个行为被调用来清理上一个自定义行为所遗留下的临时文件<br />
				使用一个可执行文件(dll)<br />
				发生在：安装、反安装。</td>
		</tr>
		<tr>
			<td>
				WiseStartup<br />
				智能启动</td>
			<td>
				这个行为使调用一个.dll文件或者提取必要Wisescript.exe文件和.dll文件的行为可以传递参数。<br />
				使用一个可执行文件(dll)<br />
				发生在: 安装、反安装</td>
		</tr>
		<tr>
			<td>
				WiseUpgradeCheck<br />
				智能可选择地升级</td>
			<td>
				这个行为被调用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。<br />
				使用一个可执行文件(dll)<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				WiseUpgradeCheckEx<br />
				智能预选升级</td>
			<td>
				添加这个行为用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。<br />
				使用一个可执行文件(dll)<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				WiseGetIISVersion<br />
				智能获得IIS版本</td>
			<td>
				对主要的IIS版本设置属性(IISVERSION).<br />
				使用一个可执行文件(dll)<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				RegisterFilterInMetabase<br />
				在管理元库中注册筛选器</td>
			<td>
				这个行为添加一个命名为ISAPI_Rewrite3的全局ISAPI筛选器到IIS管理元库里<br />
				IIS5, IIS6 管理元库: IIS:/LM/W3SVC/Filters/ add key ISAPI_Rewrite3<br />
				IIS:/LM/W3SVC/Filters/FilterLoadOrder append &quot;ISAPI_Rewrite3&quot;<br />
				使用一个可执行文件(dll)<br />
				发生在：安装。</td>
		</tr>
	</tbody>
</table>
<table>
	<tbody>
		<tr>
			<td>
				RemoveFilterFromMetabase<br />
				从管理元库中删除筛选器</td>
			<td>
				这个行为从IIS管理元库里移除了名为ISAPI_Rewrite3的全局ISAPI筛选器。<br />
				IIS5, IIS6 管理元库: IIS://localhost/W3SVC/LM/W3SVC/Filters/ delete key ISAPI_Rewrite3<br />
				IIS:/LM/W3SVC/Filters/FilterLoadOrder remove&quot;ISAPI_Rewrite3&quot;<br />
				使用一个可执行文件(dll)<br />
				发生在：反安装、回滚。</td>
		</tr>
		<tr>
			<td>
				AddApplicationExtension<br />
				添加应用程序扩展</td>
			<td>
				只用于Windows 2003机器添加ISAPI_RewriteProxy.dll到ISAPI扩展中，并使Web服务器扩展名列表中的这个ISAPI扩展名可用。<br />
				IIS6管理元库: IIS:/LM/W3SVC/<br />
				adds entry to the在管理元库属性 <b>WebSvcExtRestrictionList</b>中增加metabase property &quot;ISAPI_Rewrite3 proxy&quot;条目；<br />
				在管理元库属性<b> ApplicationDependencies </b>增加&quot;ISAPI_Rewrite3 proxy;ISAPI_Rewrite3&quot;条目；<br />
				使用一个可执行文件(dll)<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				RemoveApplicationExtension<br />
				删除应用程序扩展</td>
			<td>
				只用于Windows 2003从ISAPI扩展中删除ISAPI_RewriteProxy.dll，并从web服务器扩展名列表中删除这个ISAPI扩展名。<br />
				IIS6管理元库: IIS:/LM/W3SVC/<br />
				1.从管理元库属性 <b>WebSvcExtRestrictionList </b>中删除&quot;ISAPI_Rewrite3 proxy&quot;条目；<br />
				2.从管理元库属性 <b>ApplicationDependencies</b>中删除&quot;ISAPI_Rewrite3 proxy;ISAPI_Rewrite3&quot;条目；<br />
				使用一个可执行文件(dll)<br />
				发生在：反安装、回滚。</td>
		</tr>
		<tr>
			<td>
				RegisterExtensionInScriptMap<br />
				在脚本映射中注册扩展</td>
			<td>
				在IIS管理员库中将ISAPI_RewriteProxy.dl注册为ISAPI扩展来处理*.rwhlp文件扩展名<br />
				IIS5,IIS6管理元库: IIS://LM/W3SVC/<br />
				使用一个可执行文件(dll)<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				RemoveExtensionFromScriptMap<br />
				从脚本映射中删除扩展</td>
			<td>
				从IIS管理元库中移除作为ISAPI扩展、用于处理*.rwhlp文件扩展名的ISAPI_Rewrite.dll的注册信息<br />
				IIS5, IIS6管理元库: IIS://LM/W3SVC/<br />
				使用一个可执行文件(dll)<br />
				发生在：反安装、回滚。</td>
		</tr>
		<tr>
			<td>
				GetServisesStatus<br />
				获得服务状态</td>
			<td>
				保存IISADMIN、W2WC、NNTP、SMTP 和FTP 服务的当前状态<br />
				创建msi属性: [SERVICES_STATUS]<br />
				使用一个可执行文件(dll)<br />
				发生在: 安装、反安装。</td>
		</tr>
		<tr>
			<td>
				StartServicesEx<br />
				按预设开启服务</td>
			<td>
				根据状态预设来启动ISADMIN、W2WC、NNTP、 SMTP 和 FTP 服务<br />
				使用msi 属性: [SERVICES_STATUS]<br />
				使用一个可执行文件(dll)<br />
				发生在: 安装、反安装。</td>
		</tr>
	</tbody>
</table>
<table>
	<tbody>
		<tr>
			<td>
				SaveProductID<br />
				保存产品ID</td>
			<td>
				如果要注册产品的话，保存REGISTRATIONNAME和REGISTRATIONCODE的属性值<br />
				使用msi 属性: [REGISTRATIONNAME] , [REGISTRATIONCODE];<br />
				使用文件: [INSTALLDIR]\ISAPI_Rewrite3\httpd.conf<br />
				使用一个可执行文件(dll)<br />
				发生在: 安装。</td>
		</tr>
		<tr>
			<td>
				Check32bitMode<br />
				检测32位模式</td>
			<td>
				在64位系统中检查32位IIS兼容模式是否可用，从而安装正确的ISAPI筛选器版本。IIS6, IIS7<br />
				使用管理元库路径: IIS://LM/W3SVC/AppPools property Enable32bitAppOnWin64;<br />
				使用msi 属性:[ENABLE32BITAPPONWIN64]<br />
				检查一个32位的应用程序是否能运行在一台安装了64位版本的windows的电脑上。<br />
				使用javascript脚本<br />
				发生在: 安装。</td>
		</tr>
		<tr>
			<td>
				CheckIISModules<br />
				检测IIS模块</td>
			<td>
				在IIS7的机器上检查是否需要安装IsapiFilterModule和IsapiModule模块<br />
				IIS7 管理元库路径：<br />
				&lt;system.webServer&gt;<br />
				&lt;globalModules&gt;<br />
				<b>&lt;add name=&quot;IsapiModule&quot; image=&quot;%windir%\System32\inetsrv\isapi.dll&quot; /&gt;<br />
				&lt;add name=&quot;IsapiFilterModule&quot; image=&quot;%windir%\System32\inetsrv\filter.dll&quot; /&gt;<br />
				</b>&lt;/globalModules&gt;<br />
				&lt;/system.webServer&gt;<br />
				使用javascript脚本<br />
				发生在: 安装。</td>
		</tr>
		<tr>
			<td>
				AddGlobalIsapiFilter<br />
				添加全局ISAPI筛选器</td>
			<td>
				只用于IIS7的机器。这个行为会在IIS管理元库里添加一个命名为<i>ISAPI_Rewrite3</i>的全局ISAPI_Rewrite筛选器<br />
				IIS7的管理元库路径：<br />
				&lt;configuration&gt;<br />
				&lt;system.webServer&gt;<br />
				&lt;isapiFilters&gt;<br />
				&lt;filters&gt;<br />
				<b>&lt;filter name=&quot;ISAPI_Rewrite3&quot; path=&quot;C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll&quot; enabled=&quot;true&quot; enableCache=&quot;false&quot;&gt;<br />
				</b>&lt;/filter&gt;<br />
				&lt;/filters&gt;<br />
				&lt;/isapiFilters&gt;<br />
				&lt;/system.webServer&gt;<br />
				&lt;/configuration&gt;<br />
				使用JavaScript脚本<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				DeleteGlobalIsapiFilter<br />
				删除全局ISAPI过滤器</td>
			<td>
				只用于IIS7的机器，这个行为会从IIS管理元库中删除名为ISAPI_Rewrite3的全局ISAPI筛选器。<br />
				IIS7的管理元库路径：<br />
				&lt;configuration&gt;<br />
				&lt;system.webServer&gt;<br />
				&lt;isapiFilters&gt;<br />
				&lt;filters&gt;<br />
				<b>&lt;filter name=&quot;ISAPI_Rewrite3&quot; path=&quot;C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll&quot; enabled=&quot;true&quot; enableCache=&quot;false&quot; &gt;<br />
				</b>&lt;/filter&gt;<br />
				&lt;/filters&gt;<br />
				&lt;/isapiFilters&gt;<br />
				&lt;/system.webServer&gt;<br />
				&lt;/configuration&gt;<br />
				使用JavaScript脚本<br />
				发生在：反安装、回滚。</td>
		</tr>
	</tbody>
</table>
<table>
	<tbody>
		<tr>
			<td>
				AddIsapiCgiRestriction<br />
				添加ISAPI CGI约束</td>
			<td>
				Only for IIS7 machines register ISAPI_RewriteProxy.dll as ISAPI extension in IIS metabase.<br />
				只用于IIS7的机器，在IIS管理元库中将ISAPI_RewriteProxy.dl为ISAPI扩展<br />
				IIS7管理元库路径：<br />
				&lt;configuration&gt;<br />
				&lt;system.webServer&gt;<br />
				&lt;security&gt;<br />
				&lt;isapiCgiRestriction&gt;<br />
				<b>&lt;add path=&quot;C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll&quot; allowed=&quot;true&quot; description=&quot;Helicon Proxy&quot; /&gt;<br />
				</b>&lt;/isapiCgiRestriction&gt;<br />
				&lt;/security&gt;<br />
				&lt;/system.webServer&gt;<br />
				&lt;/configuration&gt;<br />
				使用JavaScript脚本<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				DeleteIsapiCgiRestriction<br />
				删除ISAPI CGI约束</td>
			<td>
				只用于IIS7的机器，从IIS管理元库中删除用作ISAPI扩展的ISAPI_RewriteProxy.dll。<br />
				IIS7 管理元库路径：<br />
				&lt;configuration&gt;<br />
				&lt;system.webServer&gt;<br />
				&lt;security&gt;<br />
				&lt;isapiCgiRestriction&gt;<br />
				<b>&lt;add path=&quot;C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll&quot; allowed=&quot;true&quot; description=&quot;Helicon Proxy&quot; /&gt;<br />
				</b>&lt;/isapiCgiRestriction&gt;<br />
				&lt;/security&gt;<br />
				使用JavaScript脚本<br />
				发生在：反安装、回滚。</td>
		</tr>
		<tr>
			<td>
				AddScriptMap<br />
				添加脚本映射</td>
			<td>
				只用于IIS7的机器，在IIS管理元库中将ISAPI_RewriteProxy.dll注册为ISAPI扩展用于处理*.rwhlp文件扩展名。<br />
				IIS7管理元库路径：<br />
				&lt;configuration&gt;<br />
				&lt;system.webServer&gt;<br />
				&lt;handlers&gt;<br />
				<b>&lt;add name=&quot;Helicon Proxy&quot; path=&quot;*.rwhlp&quot; verb=&quot;*&quot; modules=&quot;IsapiModule&quot; scriptProcessor=&quot;C:\Program<br />
				Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll&quot; resourceType=&quot;Unspecified&quot;/&gt;<br />
				</b>&lt;/handlers&gt;<br />
				&lt;/system.webServer&gt;<br />
				&lt;/configuration&gt;<br />
				使用JavaScript脚本<br />
				发生在：安装。</td>
		</tr>
		<tr>
			<td>
				DeleteScriptMap<br />
				删除脚本映射</td>
			<td>
				只用于IIS7的机器，从IIS管理元库里去除用作ISAPI扩展以处理*.rwhlp文件扩展名的ISAPI_RewriteProxy.dll的注册<br />
				IIS7管理元库路径：<br />
				&lt;configuration&gt;<br />
				&lt;system.webServer&gt;<br />
				&lt;handlers&gt;<br />
				<b>&lt;add name=&quot;Helicon Proxy&quot; path=&quot;*.rwhlp&quot; verb=&quot;*&quot; modules=&quot;IsapiModule&quot; scriptProcessor=&quot;C:\Program<br />
				Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll&quot; resourceType=&quot;Unspecified&quot;/&gt;<br />
				</b>&lt;/handlers&gt;<br />
				&lt;/system.webServer&gt;<br />
				&lt;/configuration&gt;<br />
				使用JavaScript脚本<br />
				发生在：反安装、回滚。</td>
		</tr>
	</tbody>
</table>
<h3>
	3.1基本概念</h3>
<div class="tCon">
	ISAPI_Rewrite提供了一个基于规则的重写引擎能飞速重写被请求的URL。它支持几乎无限量的规则和几乎无限量的附加规则条件来提供真正灵活和有效的URL处理机制。可以根据HTTP头、服务器变量、被请求的URL本身以及其它不同的条件的测试结果来对URL作出处理。<br />
	URL数据处理是用一个文本配置文件来定制的，内含各种指令设置。配置分几种等级。首先是全局（服务器范围的）配置指令，放置在ISAPI_Rewrite安装目录里的一个名为httpd.conf的文件里。那里还有若干个标签可以封装应用到特殊位置的指令：&lt;VirtualHost&gt;、&lt;Directory&gt;、&lt;DirectoryMatch&gt;、&lt;Files&gt;、 &lt;FilesMatch&gt;、&lt;Location&gt;以及&lt;LocationMatch&gt;。最后ISAPI_Rewrite支持可以放在任何网站目录里的.htaccess文件，那些文件中的规则可以应用到该位置以及它的子目录中。所有的配置文件在每次修改文件后都会被自动重载。允许用第三方程序和脚本来修改文件。<br />
	在很多情况下ISAPI_Rewrite是用来重写URL的。除了重写之外，ISAPI_REWRITE能够修改、生成、删除任何其它客户端Request中的HTTP头。模块操作可以载入改写、代理、重定向或者阻断原始客户端到服务器的请求。<br />
	Rewriting可能使服务器在得到了一个客户端的源请求时用一个新的URL继续请求处理。新的URL可以包括查询串部分（跟在问号后面），也可以指向任何一个完全的静态文件或者脚本（例如asp）、或者程序（例如.exe），等等。对用户和网站配置来说重写是彻底透明的。因为它Web应用程序收到请求之前在服务器内部执行。<br />
	Proxying使URL经过内部处理后指向另一台服务器，并很快传递到远程服务器上(换言之，规则处理在这里中止了)。远程服务器的响应很快被传回客户端。代理服务器要求你指定完整的有效URL，以协议、包括主机名开头等等。ISAPI_Rewrite使用ISAPI扩展来处理代理请求，你可以在&ldquo;代理服务器配置&rdquo;这一章里读到更多信息。<br />
	Redirection将发送一个带有重定向指令的即时响应(HTTP响应码为302或者说301)，将网址设置为一个新的位置。您可以在重定向指令里使用绝对URL格式（这是RFC2616所要求的）将请求重定向到不同的主机、端口和协议。如果此信息被忽略， ISAPI_Rewrite将自动照当前的协议、服务器名称和目录位置提供URL。重定向指令总是导致重写引擎中止处理后面的规则序列。<br />
	每个规则按它在配置文件中出现的顺序来应用。目录级配置文件从父路径开始一个接一个地处理，来自于全局配置文件的规则最先适用。<br />
	在修改URL之前ISAPI_Rewrite会保存原URL到Http头，命名为X-Rewrite-URL。然后它能够在脚本中作为HTTP_X_REWRITE_URL服务器变量取回。因为在IIS里，系统变量名不能被修改，所以ISAPI_Rewrite不能提供与Apache兼容的变量名REQUEST_URI。如果你的应用程序的设计要依赖于REQUEST_URI变量，你必须修改它，用HTTP_X_REWRITE_URL变量来代替。下面是一个PHP代码补丁的示例：<br />
	<pre>
	if (isset($_SERVER[&#39;HTTP_X_REWRITE_URL&#39;]))
{
$_SERVER[&#39;REQUEST_URI&#39;] = $_SERVER[&#39;HTTP_X_REWRITE_URL&#39;];
}</pre>
	后面跟有RewriteRule(或者RewriteProxy)指令的多重RewriteCond指令只影响单个规则。如果一些条件需要被用于多个规则，必须重复写这些条件指令以应用到每条规则上。<br />
	<h3>
		3.2和Apache下mod_rewrite的兼容性</h3>
	<div class="tCon">
		这个版本的ISAPI_Rewrite是为了最大程度上保持与Apache的mod_rewrite的兼容性。这个目标已经很大程度上实现了，尽管有一些功能无法执行，因为它们和Apeach以及UNIX结构高度绑定，而且它们在IIS上执行是不敏感的。举例说明：第H条：&ldquo;强制内容处理&rdquo;标记不能执行，因为在IIS中内容处理的范围依赖于扩展名。或者第[NS]条：&ldquo;没有子请求&rdquo;标记是无意义的，因为在IIS中是没有子请求的。<br />
		这里有一个完整的ISAPI_Rewrite和mod_rewrite兼容性图表。标记为绿色的功能或指令是充分支持的，黄色的功能是部分支持或计划在下一版本中支持，标示为红色的功能是不支持的。<br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: 宋体">兼容</span></span><span style="color: #009900"><span style="font-family: tahoma">Perl</span></span><span style="color: #009900"><span style="font-family: 宋体">的正则表达式</span></span><span style="color: #009900"><span style="font-family: tahoma"> (plus extended syntax) </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: 宋体">服务器级</span></span><span style="color: #009900"><span style="font-family: tahoma">httpd.conf</span></span><span style="color: #009900"><span style="font-family: 宋体">配置</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: 宋体">虚拟网站</span></span><span style="color: #009900"><span style="font-family: tahoma">.htaccess</span></span><span style="color: #009900"><span style="font-family: 宋体">配置文件</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: 宋体">目录</span></span><span style="color: #009900"><span style="font-family: tahoma">.htaccess</span></span><span style="color: #009900"><span style="font-family: 宋体">配置文件</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&lt;VirtualHost&gt; </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&lt;Directory&gt; </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&lt;DirectoryMatch&gt; </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&lt;Files&gt; </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&lt;FilesMatch&gt; </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&lt;Location&gt; </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&lt;LocationMatch&gt; </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">AccessFileName </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteEngine </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteRule </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">$N </span></span><span style="color: #009900"><span style="font-family: 宋体">规则后向引用</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">%N RewriteCond </span></span><span style="color: #009900"><span style="font-family: 宋体">后向引用</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">${mapname:key|default} </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">%{VARNAME} </span></span><span style="color: #009900"><span style="font-family: 宋体">服务器变量</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;!&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">取非</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[C] </span></span><span style="color: #009900"><span style="font-family: 宋体">与下一个规则联锁</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[CO=name:val:domain:lifetime:path] </span></span><span style="color: #009900"><span style="font-family: 宋体">设置</span></span><span style="color: #009900"><span style="font-family: tahoma">cookie </span></span><br />
		<span style="color: yellow"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: yellow"><span style="font-family: tahoma">[E=var:val] </span></span><span style="color: yellow"><span style="font-family: 宋体">设置环境变量</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[F] </span></span><span style="color: #009900"><span style="font-family: 宋体">强制禁止应答</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[G] </span></span><span style="color: #009900"><span style="font-family: 宋体">强制继续应答</span></span><br />
		<span style="color: #cc0000"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #cc0000"><span style="font-family: tahoma">[H=content-handler] </span></span><span style="color: #cc0000"><span style="font-family: 宋体">明确的内容处理</span></span><span style="color: #cc0000"><span style="font-family: tahoma"> (</span></span><span style="color: #cc0000"><span style="font-family: 宋体">不适用</span></span><span style="color: #cc0000"><span style="font-family: tahoma">) </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[L] </span></span><span style="color: #009900"><span style="font-family: 宋体">上一个规则标记</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[N] </span></span><span style="color: #009900"><span style="font-family: 宋体">再次应用规则</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[NC] </span></span><span style="color: #009900"><span style="font-family: 宋体">大小写不敏感</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[NE] </span></span><span style="color: #009900"><span style="font-family: 宋体">不转义输出</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[NS]</span></span><span style="color: #009900"><span style="font-family: 宋体">非内部子请求</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[P]</span></span><span style="color: #009900"><span style="font-family: 宋体">代理通过</span></span><br />
		<span style="color: yellow"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: yellow"><span style="font-family: tahoma">[PT] </span></span><span style="color: yellow"><span style="font-family: 宋体">传递通过下一个处理程序</span></span><span style="color: yellow"><span style="font-family: tahoma"> (</span></span><span style="color: yellow"><span style="font-family: 宋体">一直开启</span></span><span style="color: yellow"><span style="font-family: tahoma">) </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[QSA] </span></span><span style="color: #009900"><span style="font-family: 宋体">追加查询字符串</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[R =code] </span></span><span style="color: #009900"><span style="font-family: 宋体">重定向</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[S=num] </span></span><span style="color: #009900"><span style="font-family: 宋体">跳到下面第</span></span><span style="color: #009900"><span style="font-family: tahoma"> <i>n</i></span></span><span style="color: #009900"><span style="font-family: 宋体">条规则</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[T=MIME-type] </span></span><span style="color: #009900"><span style="font-family: 宋体">强制明确应答</span></span><span style="color: #009900"><span style="font-family: tahoma"> MIME </span></span><span style="color: #009900"><span style="font-family: 宋体">类型</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteCond </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[NC] </span></span><span style="color: #009900"><span style="font-family: 宋体">大小写不敏感</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">[OR] </span></span><span style="color: #009900"><span style="font-family: 宋体">逻辑并集</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">%{HTTP:header} </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;!&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">非</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;&lt;CondPattern&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">大于比较符</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;&gt;CondPattern&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">小于比较符</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;=CondPattern&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">等于比较符</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;-d&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">目录存在</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;-f&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">文件存在</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">&#39;-s&#39; </span></span><span style="color: #009900"><span style="font-family: 宋体">非零文件</span></span><br />
		<span style="color: yellow"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: yellow"><span style="font-family: tahoma">&#39;-l&#39; </span></span><span style="color: yellow"><span style="font-family: 宋体">符号链接</span></span><br />
		<span style="color: yellow"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: yellow"><span style="font-family: tahoma">&#39;-x&#39; </span></span><span style="color: yellow"><span style="font-family: 宋体">有可执行权限的文件</span></span><br />
		<span style="color: #cc0000"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #cc0000"><span style="font-family: tahoma">&#39;-F&#39; </span></span><span style="color: #cc0000"><span style="font-family: 宋体">通过子请求文件存在</span></span><br />
		<span style="color: #cc0000"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #cc0000"><span style="font-family: tahoma">&#39;-U&#39; </span></span><span style="color: #cc0000"><span style="font-family: 宋体">通过子请求</span></span><span style="color: #cc0000"><span style="font-family: tahoma">URL</span></span><span style="color: #cc0000"><span style="font-family: 宋体">存在</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteBase </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteMap </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">txt: </span></span><span style="color: #009900"><span style="font-family: 宋体">文本映射</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">rnd: </span></span><span style="color: #009900"><span style="font-family: 宋体">随机映射</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #009900"><span style="font-family: tahoma">int: </span></span><span style="color: #009900"><span style="font-family: 宋体">内部函数</span></span><span style="color: #009900"><span style="font-family: tahoma"> toupper, tolower, escape, unescape </span></span><br />
		<span style="color: #cc0000"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #cc0000"><span style="font-family: tahoma">prg: </span></span><span style="color: #cc0000"><span style="font-family: 宋体">外部程序</span></span><br />
		<span style="color: #cc0000"><span style="font-size: 10pt"><span style="font-family: 'courier new'">o </span></span></span><span style="color: #cc0000"><span style="font-family: tahoma">dbm: </span></span><span style="color: #cc0000"><span style="font-family: 宋体">散列文件</span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteLog </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteLogLevel </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">RewriteOptions </span></span><br />
		<span style="color: #cc0000"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #cc0000"><span style="font-family: tahoma">RewriteLock </span></span><br />
		<span style="color: #009900"><span style="font-size: 10pt"><span style="font-family: symbol">&middot; </span></span></span><span style="color: #009900"><span style="font-family: tahoma">AllowOverride </span></span></div>
	<b>3.3使用环境以及处理顺序</b><br />
	以下是这个程序文档中要被用到的使用环境的详解：<br />
	<b>server config</b><br />
	这个标志表示该指令可以用在全局httpd.conf配置文件中，但是不能用在任何一个分区（例如&lt;Virtualhost&gt;或者&lt;Directory&gt;）内部。它不允许放在.htaccess文件中。<br />
	<b>vitrual host</b><br />
	这意味着指令可以出现在&lt;VirtualHost&gt;容器内。<br />
	<b>directory</b><br />
	这个标志表示指令在&lt;Diretory&gt;、&lt;Location&gt;、&lt;Files&gt;容器内可用，而且它们的正则表达式是等价的。<br />
	<b>.htaccess</b><br />
	使用环境标为它的指令可以出现在每个目录的<i>.htaccess</i>文件中。记住当<i>RewriteRule</i>指令用在.htaccess配置文件中时，它将自动从路径中剥去本地目录前缀，只对剩下的部分应用规则。你可以使用RewriteBase指令显式地给这些规则指定一个基本路径。<br />
	<b>应用次序</b><br />
	当同一分区内的多条指令同时适用时，理解每个分区应用的次序是很重要的，因为它会对最终效果起作用。应用次序如下所述：<br />
	1.&lt;Directory&gt;(正则表达式除外)：多个&lt;Directory&gt;分区可以应用于单个请求，如果多个（非正则表达式）&lt;Directory&gt;分区匹配了包含文档的这个目录（或者它的上级目录中的一个），则按照从短到长的匹配次序应用指令。<br />
	2..htaccess文件按父目录到子目录的顺序应用。<br />
	3.&lt;Files&gt;和&lt;FileMatch&gt;同时被执行。<br />
	4.&lt;Location&gt;和&lt;LocationMatch&gt;也同时被执行。<br />
	先应用虚拟主机外面定义的相应分区和指令，再应用&lt;VirtualHost&gt;分区中的分区和指令。同一时间只有一个&lt;VirtualHost&gt;分区可以应用给请求。较晚的分区优先于较早的那些。<br />
	<span style="font-size: 14pt"><b>3.4正则表达式</b></span><br />
	正则表达式语法指南是Rege++文档的一部分，由John Maddock博士友情提供，Copyright ?1998-2004，包含在《Boost license》这本书里。完整的语法说明可以在《Boost.Regex documentation》中找到。<br />
	<b>字面值</b><br />
	所的字符都是字面值，除了&ldquo;.&rdquo;&ldquo;*&rdquo;&ldquo;?&rdquo;&ldquo;+&rdquo;&ldquo;(&rdquo;&ldquo;)&rdquo;&ldquo;{&rdquo;&ldquo;}&rdquo;&ldquo;[&rdquo;&ldquo;]&rdquo;&ldquo;^&rdquo;和&ldquo;$&rdquo;。当这些字符由&ldquo;\&rdquo;前导时也是字面值。一个字面值是个匹配它自己的字符。<br />
	<b>通配符</b><br />
	点字符&ldquo;.&rdquo;匹配空字符和换行符以外的任何单个字符。<br />
	<b>重复</b><br />
	重复是被重复任意次数的表达式。一个表达式跟着&ldquo;*&rdquo;可以被重复任意次数，包括重复零次。一个表达式跟着&ldquo;+&rdquo;可以被重复任意次数，但是至少重复一次。一个表达式跟着&ldquo;?&rdquo;可以被只重复零次或者一次。当需要明确指定重复的最低次数和最高次数时，可以用限定运算符&ldquo;{}&rdquo;。这样&ldquo;a{2}&rdquo;是字母&ldquo;a&rdquo;重复两次。&ldquo;a{2,4}&rdquo;表示字母&ldquo;a&rdquo;重复2到4次。&ldquo;a{2,}&rdquo;表示字母&ldquo;a&rdquo;重复2到无限多次。注意&ldquo;{}&rdquo;里面必须没有空格。而且它没有对上限值和下限值限定范围。所有的重复表达式参考尽可能短的前子表达式：一个单独字符，一个字符集，或者一个用&ldquo;()&rdquo;括起来的子表达式，举几个例子：<br />
	&quot;ba*&quot;匹配所有的&quot;b&quot;,&quot;ba&quot;,&quot;baaa&quot; 等等。<br />
	&quot;ba+&quot;匹配&quot;ba&quot;或&quot;baaa&quot;，但是不匹配&quot;b&quot;。<br />
	&quot;ba?&quot;匹配&quot;b&quot;或者&quot;ba&quot;。<br />
	&quot;ba{2,4}&quot;匹配&quot;baa&quot;,&quot;baaa&quot;,&quot;baaaa&quot;。<br />
	<b>懒惰型重复</b><br />
	在重复之后附加一个&ldquo;?&rdquo;就是懒惰型的重复了。一个懒惰型的重复是指匹配尽可能短的字符串。<br />
	例如：匹配HTML标记对可以使用下面这样的正则表达式：<br />
	<b>&quot;&lt;\s*tagname[^&gt;]*&gt;(.*?)&lt;\s*/tagname\s*&gt;&quot;</b><br />
	在这种情况下$1将包含标签对之间的文本，而且是最短的匹配字符串。<br />
	<b>插入成份</b><br />
	插入成分有两个用处&mdash;&mdash;把项目编组到子表达式中，并且对生成的匹配标号。例如，表达式&quot;(ab)*&quot;将匹配所有的这类字符串&quot;ababab&quot;。所有的被插入成份标号的子匹配将可以用\N或者$N语法来回溯引用到。它允许子表达式匹配空字符串，子表达式以1为开始从左往右编号。子表达式0就是整个表达式。<br />
	<h3>
		正则表达式</h3>
	<div class="tCon">
		<b><br />
		无标记插入</b><br />
		有时候你需要把子表达式编组为插入成份，但是不想为这个插入成分而吐出另一个标记的子表达式。在这种情况下，一个非标记插入(?:expression)可能有用。例如，下例表达式可以创建一个非子表达式：<br />
		<b>&quot;(?:abc)*&quot;<br />
		N择1标记</b><br />
		当表达式可以匹配一个子表达式或另一个的时候，N择1标记起作用了。每个N择1可以用|隔开。每个N择1标记是一个最大可能性前缀子表达式，它是和重复操作符相反的行为。<br />
		示例：<br />
		&quot;a(b|c)&quot;匹配&quot;ab&quot;或&quot;ac&quot;<br />
		&quot;abc|def&quot;匹配&quot;abc&quot;或&quot;def&quot;<br />
		<b>预置符</b><br />
		一个预置符是一个可以匹配所有作为预置成员的单个字符的预置。预置字符用方括号&ldquo;[&rdquo;和&ldquo;]&rdquo;括起来，可以容纳字面值、字符序列、字符类、经整理过的对象以及等价的类。用^打头的预置声明可以排除包含的内容。<br />
		示例：<br />
		字面值<br />
		&quot;[abc]&quot;匹配&quot;a&quot;或&quot;b&quot;或&quot;b&quot;。<br />
		&quot;[^abc]&quot;匹配&quot;a&quot;和&quot;b&quot;和&quot;c&quot;之外的所有字符。<br />
		字符序列<br />
		&quot;[a-z]&quot;匹配所有的从&quot;a&quot;到&quot;z&quot;的字符<br />
		&quot;[^A-Z]&quot;匹配所有的字符除了从&quot;A&quot;到&quot;Z&quot;的这些字符。<br />
		<b>字符类</b><br />
		字符类用语法&quot;[:classname:]&quot;来表示，classname是声明过的预设值中的一个。例如：&quot;[[:space:]]&quot;是所有的空白占位符的预设。下表中的字符类是可用的：
		<p>
			&nbsp;</p>
		<table>
			<tbody>
				<tr>
					<td>
						alnum</td>
					<td>
						所有的alpha数字字母</td>
				</tr>
				<tr>
					<td>
						alpha</td>
					<td>
						字母表字符[a-zA-Z]。其它字符也可以包含在内，这取决于本地环境</td>
				</tr>
				<tr>
					<td>
						blank</td>
					<td>
						所有的空白字符，包含回车或者空格</td>
				</tr>
				<tr>
					<td>
						cntrl</td>
					<td>
						所有的控制字符</td>
				</tr>
				<tr>
					<td>
						digit</td>
					<td>
						从0到9的数字</td>
				</tr>
				<tr>
					<td>
						graph</td>
					<td>
						所有的图画字符</td>
				</tr>
				<tr>
					<td>
						lower</td>
					<td>
						所有的小写字母[a-z]，其它的字符也可以包含在内，这取决于本地环境</td>
				</tr>
				<tr>
					<td>
						print</td>
					<td>
						所有的印刷字符</td>
				</tr>
				<tr>
					<td>
						punct</td>
					<td>
						所有的标点符号</td>
				</tr>
				<tr>
					<td>
						space</td>
					<td>
						所有的空白占位符</td>
				</tr>
				<tr>
					<td>
						upper</td>
					<td>
						所有的大写字母[A-Z]，其它的字符也可以包含在内，这取决于本地环境</td>
				</tr>
				<tr>
					<td>
						xdigit</td>
					<td>
						所有的16进字字符0~9，A-F</td>
				</tr>
				<tr>
					<td>
						word</td>
					<td>
						所有的词汇字符，包括字母数字外加underscore</td>
				</tr>
				<tr>
					<td>
						unicode</td>
					<td>
						所有的编码大于255的字符，这只对大范围字符特征类生效</td>
				</tr>
			</tbody>
		</table>
		<p>
			这里有一些缩写法可以代替以上字符类：<br />
			\w 代替 [:word:]<br />
			\s 代替 [:space:]<br />
			\d 代替 [:digit:]<br />
			\l 代替 [:lower:]<br />
			\u 代替 [:upper:]</p>
	</div>
	<h3>
		正则表达式</h3>
	<div class="tCon">
		<b>集合元素</b><br />
		集合元素一般采用预置声明内加[.tagname.]的格式。其中tagname既可以是一个单个字符，也可以是一个集合元素名。例如：[[.a.]]等价于[a]，[[.comma.]]等价于[,]。ISAPI_Rewrite支持所有的标准POSIX集合元素名，以及下面的这些字符组合：&ldquo;ae&rdquo;、&ldquo;ch&rdquo;、&ldquo;ll&rdquo;、&ldquo;ss&rdquo;、&ldquo;nj&rdquo;、&ldquo;dz&rdquo;、&ldquo;lj&rdquo;、任意小写、大写、首字母大写的变化组合。多个字符集合元素可以导致预置匹配一个以上的字符。例如：[[.ae.]]将匹配两个字符，但是[^[.ae.]]只会匹配一个字符。<br />
		<b>等价类</b><br />
		等价类一般采用预置声明内加[=tagname=]的格式，其中tagname既可以是单个字符，也可以是一个集合元素的名称，它能匹配同样的主要等价类成员的字符，就跟集合元素[.tagname.]一样。一个等级类是一个相同整理的字符预设，但主要是一个等价类的字符集，其主要排序关键字都是一样的（例如，字符串通常先依字符整理，然后根据重音，然后根据大小写。主要排序键与字符相关，次要与重音相关，再次与大小写相关。如果没有等价类符合tagname，则[=tagname=]是与[.tagname.]完全一样的。<br />
		Equivalence classes take the general form [=tagname=] inside a set declaration, where tagname is either a single character, or a name of a collating element, and matches any character that is a member of the same primary equivalence class as the collating element [.tagname.]. An equivalence class is a set of characters that collate the same, a primary equivalence class is a set of characters whose primary sort key are all the same (for example strings are typically collated by character, then by accent, and then by case; the primary sort key then relates to the character, the secondary to the accentation, and the tertiary to the case). If there is no equivalence class corresponding to tagname, then [=tagname=] is exactly the same as [.tagname.].<br />
		要在一个预设中包含字面值&ldquo;-&rdquo;，请这样做：使它成为开放的&ldquo;[&rdquo;或者&ldquo;[^&rdquo;后面的第一个字符、一个系列或者一个集合元素的末点，或者用一个前置的转义字符如&ldquo;[\-]&rdquo;。要在一个预设中包含一个字面值&ldquo;[&rdquo;或者&ldquo;]&rdquo;或者&ldquo;^&rdquo;，请把它们作为一个系列或者一个集合元素的末点，或者用一个前置的转义字符。<br />
		<b>行锚</b><br />
		锚用来匹配一行开头或结尾的空串。&ldquo;^&rdquo;匹配行开头的空串，&ldquo;$&rdquo;匹配行结尾的空串。<br />
		<b>回溯引用</b><br />
		回溯引用是引用前面已经被匹配的子表达式。这个引用是被匹配的子表达式，而不是表达式本身。回溯引用包括转义字符&ldquo;\&rdquo;跟着一个从1到9的数字。&ldquo;\1&rdquo;引用第一个子表达式，&ldquo;\2&rdquo;引用第二个，依次类推。举个例子，表达式&ldquo;(.*)\1&rdquo;匹配任何关于它的中点重复的字符串，比如说&ldquo;abcabc&rdquo;或者&ldquo;xyzxyz&rdquo;。一个对子表达式的回溯引用不参加任何匹配，匹配空字符串。在ISAPI_Rewrite中，所有的回溯引用是对整个RewriteRule和相应的RewriteCond指令是全局性相关的。RewriteRule指令中如果有RewirteCond子令的话，子匹配从相应的RewriteRule指令的第一个RewriteCond指令开始从上到下从左往右编号。<br />
		<b>向前查找</b><br />
		向前查找有两种形式：正向前查找和负向前查找。<br />
		&bull; &quot;(?=abc)&quot;匹配跟在表达式&quot;abc&quot;后面的零字符。<br />
		&bull; &quot;(?!abc)&quot;匹配不跟在表达式&quot;abc&quot;后面的零字符。<br />
		<b>通配符</b><br />
		下面的运算符提供了与GNU正则表达式库的兼容性。<br />
		&bull; &quot;\w&quot;匹配任意单个组词字符，它等价于表达式&ldquo;[[:word:]]&rdquo;。<br />
		&bull; &quot;\W&quot;匹配任意一个非组词字符，它等价于表达式&ldquo;[^[:word:]]&rdquo;。<br />
		&bull; &quot;\&lt;&quot;匹配词头空字符串。<br />
		&bull; &quot;\&gt;&quot;匹配词尾空字符串。<br />
		&bull; &quot;\b&quot;匹配词头或者词尾空字符串。<br />
		&bull; &quot;\B&quot;匹配词语中的空字符串。<br />
		<b>转义字符</b><br />
		转义字符&ldquo;\&rdquo;含有多重意义：<br />
		&bull; 转义字符可以引导一个运算符，例如：回溯引用、词操作符<br />
		&bull; 转义字符可以使下面的字符正常，比如说&ldquo;\*&rdquo;代表一个字面值&ldquo;*&rdquo;，而不是重复运算符。</div>
</div>
<p>
	<b>单个字符转义序列</b><br />
	下面的转义序列是单个字符的别名：</p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				转义序列</td>
			<td>
				字符代码</td>
			<td>
				含义</td>
		</tr>
		<tr>
			<td>
				\a</td>
			<td>
				0x07</td>
			<td>
				信号铃记号.</td>
		</tr>
		<tr>
			<td>
				\t</td>
			<td>
				0x09</td>
			<td>
				制表符</td>
		</tr>
		<tr>
			<td>
				\v</td>
			<td>
				0x0B</td>
			<td>
				垂直制表符</td>
		</tr>
		<tr>
			<td>
				\e</td>
			<td>
				0x1B</td>
			<td>
				ASCII转义字符</td>
		</tr>
		<tr>
			<td>
				\0dd</td>
			<td>
				0dd</td>
			<td>
				八进制字符代码，其中dd是一个或多个八进制数字。</td>
		</tr>
		<tr>
			<td>
				\xXX</td>
			<td>
				0xXX</td>
			<td>
				十六进制字符代码，其中XX是一个或多个八进制数字。</td>
		</tr>
		<tr>
			<td>
				\x{XX}</td>
			<td>
				0xXX</td>
			<td>
				十六进制字符代码，其中XX是一个或更多十六进制数字，可选用Unicode字符。</td>
		</tr>
		<tr>
			<td>
				\cZ</td>
			<td>
				z-@</td>
			<td>
				ASCII转义序列control-Z，其中Z是任意一个编码大于或等于&ldquo;@&rdquo;的编码的ASCII字符。</td>
		</tr>
	</tbody>
</table>
<p>
	<b>杂项转义序列</b><br />
	以下提供perl的大部分兼容性，但是在\l、\L、\u和\U上有一些区别</p>
<table>
	<tbody>
		<tr>
			<td>
				转义序列</td>
			<td>
				含义</td>
		</tr>
		<tr>
			<td>
				\w</td>
			<td>
				等价于 [[:word:]].</td>
		</tr>
		<tr>
			<td>
				\W</td>
			<td>
				等价于[^[:word:]].</td>
		</tr>
		<tr>
			<td>
				\s</td>
			<td>
				等价于[[:space:]]。</td>
		</tr>
		<tr>
			<td>
				\S</td>
			<td>
				等价于[^[:space:]]。</td>
		</tr>
		<tr>
			<td>
				\d</td>
			<td>
				等价于[[:digit:]]。</td>
		</tr>
		<tr>
			<td>
				\D</td>
			<td>
				等价于[^[:digit:]]。</td>
		</tr>
		<tr>
			<td>
				\l</td>
			<td>
				等价于[[:lower:]]。</td>
		</tr>
		<tr>
			<td>
				\L</td>
			<td>
				等价于[^[:lower:]]。</td>
		</tr>
		<tr>
			<td>
				\u</td>
			<td>
				等价于[[:upper:]]。</td>
		</tr>
		<tr>
			<td>
				\U</td>
			<td>
				等价于[^[:upper:]]。</td>
		</tr>
		<tr>
			<td>
				\C</td>
			<td>
				任何单个字符，等价于&ldquo;.&rdquo;</td>
		</tr>
		<tr>
			<td>
				\X</td>
			<td>
				匹配任何Unicode组合字符序列，例如&ldquo;a\x0301&rdquo;(字符a和一个尖角)</td>
		</tr>
		<tr>
			<td>
				\Q</td>
			<td>
				开始引号运算符。后面跟前的所有的内容都被当作字面值，直到发现一个\E结束运算符。</td>
		</tr>
		<tr>
			<td>
				\E</td>
			<td>
				结束引用运算符，终止一个由\Q开头的引用序列。</td>
		</tr>
	</tbody>
</table>
<p>
	<b>怎样得到匹配</b><br />
	正则表达式将匹配第一个可匹配字符串。如果从给定的起始处可以匹配到不止一个字符串，则它会匹配那个能匹配得最长的字符串。如果从同一个起始处有多个合适的匹配，而且每个匹配的长度都一样，则将选择那个第一子表达式匹配得最长的匹配。如果有两个以上的匹配字符串它们的第一子表达式匹配得一样长，则比较第二子表达式匹配的长度，如此类推。注意：ISAPI_Rewrite使用比封演算法。只有表达式匹配了整个顺序串才能得到匹配结果。例如：<br />
	&bull; RewriteCond URL ^/somedir/.* #将匹配任何导向somedir目录以及它的子目录的请求，与此同时，<br />
	&bull; RewriteCond URL ^/somedir/ #只匹配somedir根目录的请求。<br />
	<b>对&ldquo;病态&rdquo;正则表达式的特别提示：</b><br />
	ISAPI_Rewrite 使用了一个非常强大的来自Boost库的正则表达式引擎。但是它依然有一些局限性：有着一些&ldquo;病态&rdquo;的表达式，它可能会指数级地消耗匹配时间。这些都涉及到嵌套重复运算符，例如试图对N个连续字母a匹配表达式&ldquo;(a*a)*b&rdquo;，消耗的时间将与N<sup>2</sup>成正比。这些表达式常常能改成另一种写法来避免这种问题。例如，&ldquo;(a*a)*b&rdquo;可以被改写成&ldquo;a*b&rdquo;，解析它消耗的时间与N成正比。在多数情况下，非嵌套重复表达式消耗的时间与N<sup>2</sup>成正比，但是，如果条款是相互排斥的，则它们会在线性时间里完成匹配。在&ldquo;a*b&rdquo;这种情况下，每个字符将要么匹配a要么匹配b或者不匹配。相较之下，&ldquo;a*a&rdquo;匹配器不能告知哪个分支被采取（第一个 a还是第二个a）因此必须尝试两种。<br />
	Regex可以检测出这种&ldquo;病态&rdquo;的正则表达式并终止和它们的匹配。这将使ISAPI_Rewrite的规则失效。当一个规则失效时，ISAPI_Rewrite将给客户端发送一个&quot;Internal Server error - Rule Failed&quot;的状态，以表示配置错误。</p>
<p>
	<span style="font-size: 14pt"><b>4.1AccessFileName指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				设置分布式配置文件的名称</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				<i>AccessFileName filename</i> [filename] ...</td>
		</tr>
		<tr>
			<td>
				默认值</td>
			<td>
				<i>AccessFileName .htaccess</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config</td>
		</tr>
	</tbody>
</table>
<p>
	指定一个ISAPI_ReWrite寻求分布式配置的文件名列表。默认文件名是.htaccess。ISAPI_ReWrite只能载入它能在这个列表中找到的第一个文件。默认情况下ISAPI_ReWrite管理者会以<i>hidden</i>属性标记配置文件-它将防止文件被远程用户直接访问到。<br />
	如果配置文件进行了任何修改，它将在下次请求服务器时自动加载。</p>
<p>
	<span style="font-size: 14pt"><b>4.2AllowOverride指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				明确规定了每个目录重写的基准URL。</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				<i>AllowOverride Al</i>l|<i>None</i>|<i>directive-type [directive-type] ..</i>.</td>
		</tr>
		<tr>
			<td>
				默认值</td>
			<td>
				<i>AllowOverride All</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令声明了在分布式.htaccess文件里的指令是否可以覆盖父级别的httpd.conf中的指令。在ISAPI_Rewrite的使用环境中，这个指令实际上控制了特定虚拟主机或者目录的.htaccess文件的可用或者不可用。目前只支持三个值：<b>All</b>、<b>None</b>和<b>FileInfo</b>。<br />
	<b>All</b>和<b>FileInfo</b>使.htaccess文件以及它里面的整个ISAPI_Rewrite目录可用，<b>None</b>使所有的.htaccess文件以及目录不可用。这些目录具有继承性。这意味着如果你为一些目录或者虚拟主机指定<i>AllowOverride none</i>，.htaccess文件将对整个子目录树不可用。</p>
<p>
	<span style="font-size: 14pt"><b>4.4RewriteRule指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				定义URL重写规则</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteRule <i>Pattern Substitution</i> [flags]</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令定义了单个URL重写操作。它可能在一个配置文件中出现多次，每个实例定义一个重写URL的规则。RewriteRule指令包含URL匹配模式、替换字符串以及可选的标志设置。<br />
	<b><i>Pattern</i></b>（模式）是一个用来匹配当前URL的Perl兼容正则表达式。当前的URL可以是原来请求的URL或者已经由优先级高的规则替改过的URL。网址从不包含协议或者主机名，从第一个斜杠字符开始（只对httpd.conf文件适用）。而且当前网址还因不同的应用配置级别而异。对于目录级配置（.htaccess文件），结尾的斜线和配置文件的目录名，会在匹配时被从URL中忽略掉。在创建正则表达式时，请阅读这个文档的正则表达式语法部分来得到更多的信息。<br />
	&quot;!&quot;字符打头的模式将否定整个表达式。否定模式不能产生子匹配，所以你不能使用$N的替代引用。<br />
	<b><i>Substitution</i></b>(替换)字符串指定了模式是匹配时生成URL的格式字符串。除了纯文本，它可以包括这些特殊字符。<br />
	&bull; 对Rewrite模式的回溯引用 <b>$N</b><br />
	&bull; 对Rewrite模式的回溯引用 <b>%N</b><br />
	&bull; 服务器变量 <b>%{VARNAME}</b><br />
	&bull; 条件格式模式 <b>Ntrue_string:false_string </b><br />
	&bull; 分组括号&ldquo;<b>(</b>&rdquo;和&ldquo;<b>)</b>&rdquo;<br />
	替换字符串将所有的字符视为字面值，除了$&#39;、&#39;\&#39;、&#39;(&#39;、&#39;)&#39;，&#39;?&#39;，&#39;:&#39;和&#39;\&#39;。为了字面化地读出特殊字符，它定义了用&quot;<b>\</b>&quot;引导的转义字符。下面的特殊字符是允许的。</p>
<table>
	<tbody>
		<tr>
			<td>
				$&amp;</td>
			<td>
				输出匹配的整个表达式。</td>
		</tr>
		<tr>
			<td>
				$`</td>
			<td>
				输出上一个的匹配结束到当前匹配的开始之间的文本(如果之前没有找到匹配串，则输出从开头到当前匹配的开始之间的文本)。</td>
		</tr>
		<tr>
			<td>
				$&#39;</td>
			<td>
				输出当前匹配之后跟着的所有文字。</td>
		</tr>
		<tr>
			<td>
				$$</td>
			<td>
				输出字面值$</td>
		</tr>
		<tr>
			<td>
				\a</td>
			<td>
				信号铃字符</td>
		</tr>
		<tr>
			<td>
				\f</td>
			<td>
				表单反馈字符</td>
		</tr>
		<tr>
			<td>
				\n</td>
			<td>
				新行字符</td>
		</tr>
		<tr>
			<td>
				\r</td>
			<td>
				回车符</td>
		</tr>
		<tr>
			<td>
				\t</td>
			<td>
				制表符</td>
		</tr>
		<tr>
			<td>
				\v</td>
			<td>
				垂直制表符</td>
		</tr>
		<tr>
			<td>
				\x</td>
			<td>
				十六进制字符，比如说\x0D.</td>
		</tr>
		<tr>
			<td>
				\x{}</td>
			<td>
				一个可能的Unicode十六进制字符-例如\x{1A0}</td>
		</tr>
		<tr>
			<td>
				\cx</td>
			<td>
				ASCII的转义字符x，例如\c @等价于escape-@。</td>
		</tr>
		<tr>
			<td>
				\e</td>
			<td>
				The ASCII 转义字符</td>
		</tr>
		<tr>
			<td>
				\dd</td>
			<td>
				八进制字符常量，例如\10。</td>
		</tr>
		<tr>
			<td>
				\l</td>
			<td>
				导致下一个字符被小写输出。</td>
		</tr>
		<tr>
			<td>
				\u</td>
			<td>
				导致下一个字符被大写输出。</td>
		</tr>
		<tr>
			<td>
				\L</td>
			<td>
				导致整个后继字符串被小写输出，直到遇到\E。</td>
		</tr>
		<tr>
			<td>
				\U</td>
			<td>
				导致整个后继字符串被大写输出，直到遇到\E。</td>
		</tr>
		<tr>
			<td>
				\E</td>
			<td>
				结束\L或者\U的后续字符串</td>
		</tr>
		<tr>
			<td>
				\\</td>
			<td>
				单个反斜杠字符&#39;\&#39;</td>
		</tr>
	</tbody>
</table>
<p>
	RewriteRule从父配置文件开始按照在配置文件中出现的次序应用。每个规则只有在它的<i>Pattern</i>匹配了一个URL而且所有连接条件（RewriteCond）都匹配时才会被应用。在该URL用Substitution完成替换之后，重写过程还在继续，一直到配置文件结束或者遇到一个用了任何停止标志的规则。在<i>Substitution</i>中的特殊字符串&quot;-&quot;(短横)意味着没有替换，而且当你需要应用该规则并留下的原始的未被染指过的URL时它是很有用的。<br />
	此外，这里有一个支持的<b>flag</b>(标志)列表。这些标识可以改变规则的表现。与Apache完全兼容的标志被标记为绿色，不支持的标志被标记为绿色，只在 ISAPI_Rewrite中被支持的标识被标记成黄色。<br />
	<span style="color: #f6cc0b"><b>CU</b> (Case Upper)</span><br />
	把替换字符串改成大写.<br />
	<span style="color: #f6cc0b"><b>CL</b> (Case Lower)</span><br />
	把替换字符串改成小写.<br />
	<b><span style="color: #3fa701">chain|C</span></b><br />
	将当前规则与后一条规则链接起来，后一条规则只有在当前规则被匹配的情况下才能被执行。链接可以再后续链接。<br />
	<b><span style="color: #3fa701">cookie|CO=NAME:VAL:domain[:lifetime[:path]]</span></b><br />
	设置一个有指定字段的cookies头，并把它和当前请求的响应一起发送到客户端。<br />
	<b><span style="color: #3fa701">env|E=VAR:VAL</span></b><br />
	不支持，在UNIX环境中设置一个环境变量，在Windows系统中无意义。<br />
	<b><span style="color: #f10b00">forbidden|F</span></b><br />
	发送即时403 FORBIDDEN响应到客户端，停止这个请求的规则处理以及所有其他的替换处理。<br />
	<b><span style="color: #3fa701">gone|G</span></b><br />
	发送一个即时401Gone响应到客户端，停止这个请求的规则处理以及所有其他的替换过程。<br />
	<b><span style="color: #f10b00">handler|H=Content-handler</span></b><br />
	不支持，为请求明确指定了处理处理。在IIS的世界中这是可以通过重写请求的文件扩展名来实现。但是没有从Apache处理到IIS文件扩展名的直接转换方法。<br />
	<b><span style="color: #3fa701">last|L</span></b><br />
	停止这里的重写处理，不再应用当前配置文件中的其它规则。在这种情况下，后代的.htaccess文件依然能被用到。<br />
	<b><span style="color: #e0b800">loop|LP</span></b><br />
	在一个循环中重复运行当前单个规则直到它的模式以及条件不再被匹配了。循环次数被限定为200免得陷入无限循环。<br />
	<b><span style="color: #3fa701">next|N</span></b><br />
	从当前配置文件开始处重复运行重写处理。循环次数被限定为200免得陷入无限循环。<br />
	<b><span style="color: #3fa701">nocase|NC</span></b><br />
	这个标记使Pattern大小写不敏感。<br />
	<b><span style="color: #3fa701">noescape|NE</span></b><br />
	不转义输出。在ISAPI_Rewrite默认情况下，在输出中会把所有的非ANSI字符编码为十六进制数%xx。<br />
	<b><span style="color: #3fa701">nosubreq|NS</span></b><br />
	这个标识在ISAPI_Rewrite中与在Apache中含义不同。精确的转换是不可能的，但这个标志可能仍然是有用的。每当配置文件处理完成之后，URL被重写了，ISAPI_Rewrite将启动这个新的URL处理过程（与Apache相同）使它可以应用到另一个配置文件中。此标识意思是该规则只针对初始用户的请求执行，不针对已被重写过的请求执行，以防可能出现的循环。ISAPI_Rewrite限定循环重复次数为10。<br />
	<b><span style="color: #3fa701">nounicode|NU</span></b><br />
	如果设置了NU标记，从Unicode转换为UTF - 8将不会发生。所有Unicode字符会保持它的%xx格式不变。<br />
	<b><span style="color: #e0b800">O (nOrmalize)</span></b><br />
	留着用于与ISAPI_Rewrite 2.x兼容。如果使用了RewriteCompatibility2，这个指令在处理之前将URL规范化。规范化包括移除一个URL编码、错误字符，等等。同时URL的规范化将完全移除它的查询字符串。如果RewriteCompatibility2 没有被使用，URL按照默认被规范化（就如同它在mod_rewrite中所做的），此标志的含义将反转。<br />
	<b><span style="color: #3fa701">proxy|P</span></b><br />
	将结果URL强制内部处理为另一台服务器上的目标，并即时传到远程服务器上，并且，规则处理在这里中断了。远程服务器的响应将被传递回客户端。proxy需要您指定完整的URL，由协议、主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你可以在代理配置章节中阅读到更多有关于此的内 容。<br />
	<b><span style="color: #f10b00">passthrough|PT</span></b><br />
	不支持或者始终支持。在IIS中结果始终传递到下一个处理<br />
	<b><span style="color: #3fa701">qsappend|QSA</span></b><br />
	追加当前查找串的数据到替换串而不是由一个替换字符串取代它。当你需要在保留原来的参数再添加更多的查询字符串参数时，可以使用它。<br />
	<b><span style="color: #3fa701">redirect|R [=code]</span></b><br />
	强制服务器用重定向指令给客户端发送一个即时响应，提供一个新的接替位置。可以选加前缀http://thishost[:thissport]/从而把URL带到一个可用的绝对形式。如果没有给出代码，将使用一个302响应(暂时性移动)。你可以选择在3XX系列范围内指定任何代码。<br />
	<b><span style="color: #3fa701">skip|S=num</span></b><br />
	如果当前的规则匹配，强制rewrite引擎跳过后面<i>num</i>个规则。<br />
	<b><span style="color: #3fa701">type|T=MIME-type</span></b><br />
	强制目标文件的MIME类型转换成被设定的MIME类型。这能够被用来根据一些条件设置内容类型。<br />
	<b><span style="color: #e0b800">U (Unmangle log)</span></b><br />
	无损记录。记录它原来请求的网址，而不是被重写的URL。</p>
<p>
	<span style="font-size: 14pt"><b>4.5RewriteCond指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				为以下的RewriteRule定义一个条件</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteCond<i> TestString CondPattern</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	该指令为后面的RewriteRule，RewriteHeader或RewriteProxy指令规定了一个条件。一个规则指令前可以有一个或多个条件，规则只有在所有条件得到满足的情况下才被应用。<br />
	<b><i>TestString</i></b>附加到纯文本可以包含下列结构。<br />
	&bull; 用语法<b>$N</b>回溯引用RewriteRule模式<br />
	&bull; 用语法<b>%N</b>回溯引用前面的RewriteCond模式<br />
	&bull; 用语法<b>${mapname:key|default}</b>扩展RewriteMap<br />
	&bull; 用语法<b>%{HTTP:header}</b>指代HTTP头值<br />
	&bull; 用语法<b>%{NAME_OF_VARIABLE}</b>指代服务器变量<br />
	以下是可用的服务器变量列表：</p>
<table>
	<tbody>
		<tr>
			<td>
				HTTP_USER_AGENT<br />
				HTTP_REFERER<br />
				HTTP_COOKIE<br />
				HTTP_FORWARDED<br />
				HTTP_HOST<br />
				HTTP_PROXY_CONNECTION<br />
				HTTP_ACCEPT<br />
				REMOTE_ADDR<br />
				REMOTE_HOST<br />
				REMOTE_PORT<br />
				REMOTE_USER<br />
				REMOTE_IDENT<br />
				REQUEST_METHOD<br />
				SCRIPT_FILENAME<br />
				PATH_INFO<br />
				QUERY_STRING<br />
				AUTH_TYPE</td>
			<td>
				DOCUMENT_ROOT<br />
				SERVER_NAME<br />
				SERVER_ADDR<br />
				SERVER_PORT<br />
				SERVER_PROTOCOL<br />
				SERVER_SOFTWARE<br />
				API_VERSION<br />
				THE_REQUEST<br />
				REQUEST_URI<br />
				REQUEST_FILENAME<br />
				HTTPS</td>
			<td>
				TIME_YEAR<br />
				TIME_MON<br />
				TIME_DAY<br />
				TIME_HOUR<br />
				TIME_MIN<br />
				TIME_SEC<br />
				TIME_WDAY<br />
				TIME<br />
				另外，所有的IIS特有的变量都是支持的。</td>
		</tr>
	</tbody>
</table>
<p>
	CondPattern指定一个应用于TestString实例的正则表达式，以下特殊值也支持：<br />
	1.在正则表达式前头加&ldquo;!&rdquo;符号指明否定模式。<br />
	2.<b>&#39;&lt;CondPattern&#39;</b>将CondPattern作为一个纯字符串按字典顺序比较，结果比较大<br />
	3.<b>&#39;&gt;CondPattern&#39;</b>按字典顺序比较，结果比较小<br />
	4.<b>&#39;=CondPattern&#39;</b>按字典顺序比较，结果相等<br />
	5.<b>&#39;-d&#39;</b> 检测字符串是否存在目录。<br />
	6.<b>&#39;-f&#39;</b> 检测字符串是否存在文件。<br />
	7.<b>&#39;-s&#39;</b> 检测字符串是不是一个非零大小的文件。<br />
	8.<b>&#39;-l&#39;</b> (链接) 不支持的，始终为false。<br />
	9.<b>&#39;-x&#39;</b> (拥有可执行权限) 不支持的，始终为true。<br />
	10.<b>&#39;-F&#39;</b> (存在的文件，通过子请求) 不支持，和&#39;&ndash;f&#39;一样。<br />
	11.&#39;-U&#39; (存在的URL，通过子请求) 不支持的，始终为false。<br />
	下面的标记也是支持的：<br />
	<b><span style="color: #3fa701">&#39;nocase|NC&#39;</span></b><br />
	这个标记使模式大小写不敏感。<br />
	<b><span style="color: #3fa701">&#39;ornext|OR&#39; </span></b><br />
	这个标记用逻辑或而不是隐含的逻辑与结合子请求RewriteCond指令。<br />
	<b><span style="color: #3fa701">O</span></b><br />
	留用于ISAPI_Rewrite 2.x的兼容性。在处理前规范化字符串。规范化包括移除一个URL编码、错误字符，等等。同时URL的规范化将完全移除它的查询字符串。</p>
<p>
	<span style="font-size: 14pt"><b>4.6RewriteBase指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				为每个目录的重写设置一个基准的URL</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteBase <i>URL-path</i></td>
		</tr>
		<tr>
			<td>
				默认值</td>
			<td>
				RewriteBase <i>requested-directory-path</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	当RewriteRule指令用于每个目录的配置文件(.htaccess)时，它将自动从路径中剥去本地目录前缀，只对剩下的部分应用规则。<b>RewriteBase</b>指令允许你为这些规则精确指定一个基准。比如，哪部分要被剥离。<br />
	和Apache的mod_rewrite不同，ISAPI_Rewrite的访问不仅仅针对于物理路径，同时还针对于虚拟路径，而且可以自动地选择正确的基准。所以这个指令只是为了兼容性原因而被保留的。<br />
	<b><i>URL-path</i></b>可以是相对于根的路径也可以是空，空的<i>URL-path</i>意味着规则的基准等同于网站的根目录。</p>
<p>
	<span style="font-size: 14pt"><b>4.7RewriteProxy指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				代理请求到一个远程服务器</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteProxy <i>Pattern Substitution [flags]</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	使结果URL被内部处理为另一台服务器上的目标，并即时传递到远程服务器，从此中断了规则处理。远程服务器的响应将被传递回客户端。代理要求您指定完整的URL，由协议，主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你可以在配置代理的章节里阅读到更多。<br />
	语法和操作符与RewriteRule指令是相同的。但是RewroteProxy指令支持一些额外的标记。<br />
	<span style="color: #f6cc0b"><b>H </b>(preserve Host)</span><br />
	代理模块在连接远程服务器时将使用随着源请求一起发送过来的主机头，如果没有这个标志代理服务器则将用主机名和远程服务器的端口号组成主机头。<br />
	<span style="color: #f6cc0b"><b>A </b>(<b>A</b>dd authentication headers)</span><br />
	允许从代理服务器将一个认证信息传递到局域网服务器上，当客户端认证和代理服务器冲突时它很有用。服务模块将对一个请求的服务器变量</p>
<pre>
AUTH_TYPE,
AUTH_USER,
LOGON_USER,
REMOTE_USER</pre>
<p>
	追加相应的头</p>
<pre>
X-ISRW-Proxy-AUTH-TYPE,
X-ISRW-Proxy-AUTH-USER,
X-ISRW-Proxy-LOGON-USER,
X-ISRW-Proxy-REMOTE-USER</pre>
<p>
	到被代理的服务器。<br />
	<span style="color: #f6cc0b"><b>CR </b>(use Credentials)</span><br />
	代理模块将尝试用在URL中指定的证书身份验证登录远程服务器，或者用基本身份验证头登录远程服务器。用了这个标志，你可以在一个替换字符串中使用http://user:password@host.com/page语法作为一个URL。</p>
<p>
	<span style="font-size: 14pt"><b>4.8RewriteHeader指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				重写任何请求的HTTP头</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteHeader <i>HeaderName: Pattern Substitution [flags]</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	这个RewriteHeader指令是<i>RewriteRule</i>指令中的一个很常用的变量。而且它被设计用来重写客户端的URL部分以及HTTP头的部分。技术上的<i>RewriteRule</i>指令，相当于<i>RewriteHeader</i>的<i>URL Pattern Substitution [flag]</i>。这个指令可用于在IIS里更多应用程序的处理之前重写、创建或者删除任何客户端请求的HTTP头。<br />
	<b><i>HeaderName</i></b>：指定将被重写的HTTP头的名字。<br />
	<i>pattern</i>、<i>Substitution</i>和<i>flag</i>与RewriteRule指令中都是相同的。</p>
<p>
	<span style="font-size: 14pt"><b>4.9RewriteMap指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				为一个映射函数值定义一个键</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteMap<i> MapName MapType:MapSource</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	<i>RewriteMap</i>指令被用来定义一个键到值的查找功能。当你需要映射大量的值时，它会很有用的，而且它的速度远远快过用规则匹配来做到它。映射功能的性能受映射文件的大小影响微乎其微。有三种类型的映射：<br />
	&bull; <b>txt</b>：用一个文本文件映射<br />
	&bull; <b>rnd</b>：从多个可选项中产生随机值<br />
	&bull; <b>int</b>：内部函数<br />
	<b><i>MapName</i></b>是这个映射功能的名字，在RewriteRule命令中被用来指定这个映射。请确保每个映射用唯一的名称定义。你可以使用以下语法在RewriteRule指令的<i>Substitution</i>参数中调用映射功能</p>
<pre>
${ MapName : LookupKey | DefaultValue } </pre>
<p>
	如果这个结构是在<i>Substitution</i>中出现，ISAPI_Rewrite将在映射中查找这个键，万一找到了一个，就用它的值替换这个结构。如果什么值也没有被找到，将用可选的DefaultValue。如果没有指定DefaultValue，它将用一个空串替换。<br />
	下面的标志也是支持的：<br />
	<b><span style="color: #3fa701">&lsquo;nocase|NC&rsquo;</span></b><br />
	这个标志使该查找键大小写不敏感。<br />
	<b>下面是一个大小写不敏感映射文件指令的示例</b></p>
<pre>
RewriteMap examplemap txt:C:/path/to/file/map.txt [NC]</pre>
<p>
	到<i>MapSource</i>文件的路径，既可以是绝对地址也可以是相对地址。相对地址将被从当前配置的文件夹开始推算，换言之，就是从这个定义映射的配置文件的路径开始推算。<br />
	然后你可以在RewriteRule中如下使用这个映射：</p>
<pre>
RewriteRule ^/ex/(.*) ${examplemap:$1}</pre>
<p>
	下列<i>MapType</i>和<i>MapSource</i>的组合是可用的：<br />
	<b>txt</b>：纯文本映射，它的source是到一个可用的文本文档的windows文件系统路径。文本文档必须是如下格式的：</p>
<pre>
#This is a comment
key1 value1 #Another comment
key2 value2
keyN valueN</pre>
<p>
	<b>rnd</b>：随机查找多个值。Source是一个文本文档的路径，文本文档必须是以下格式：</p>
<pre>
#This is a comment
key1 value1|value2|value3
key2 value4|value5|value6|valueN</pre>
<p>
	<b>int:</b> 调用内部函数。 Source必须是下列预定义的内部函数之一：<br />
	&bull; <b>toupper:</b> 转换关键词为大写形式。<br />
	&bull; <b>tolower:</b>转换关键词为小写形式。<br />
	&bull; <b>escape:</b>把特定字符编码为十六进制。<br />
	&bull; <b>unescape:</b>把十六进制值编译为特定字符。</p>
<p>
	<span style="font-size: 14pt"><b>4.10RewriteLog指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				设置ISAPI_Rewrite日志文件的名称</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteLog<i> file-path</i></td>
		</tr>
		<tr>
			<td>
				默认值</td>
			<td>
				RewriteLog<i> installdir\rewrite.log</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令用来设定记录ISAPI_Rewrite动作的日志文件的文件名。示例：</p>
<pre>
Rewritelog &quot;C:\local\path\rewrite.log&quot;</pre>
<p>
	<span style="font-size: 14pt"><b>4.11RewriteLogLevel指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				设置日志级别</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteLogLevel <i>Level</i></td>
		</tr>
		<tr>
			<td>
				默认值</td>
			<td>
				RewriteLogLevel 0</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令设置日志的输出长度。默认值0表示不记日志，而最大的级别9则表示所有的动作都要记录。<br />
	使用使用较高的级别值可能会降低ISAPI_Rewrite的操作速度。我们建议你当你完成规则调试之后，通过设置日志级别为零来禁用日志。</p>
<p>
	<span style="font-size: 14pt"><b>4.12RewriteOptions指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				指定特殊选项</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteOptions Options</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令可以为ISAPI_Rewrite设置特定选项。当前只有惟一一个选项可用：<b>inherit</b>。<br />
	<b>inherit</b>：强迫当前配置从父级继承所有的选项和规则。这意味着来自父级配置的所有的规则将被再次执行，除非当前环境另有相应重写规则。</p>
<p>
	<span style="font-size: 14pt"><b>4.13RewriteCompatibility2指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				启用或禁用ISAPI_Rewrite 2.x兼容模式</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				RewriteCompatibility2 <i>on</i>|<i>off</i></td>
		</tr>
		<tr>
			<td>
				默认值</td>
			<td>
				RewriteCompatibility2 off</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	这一指令将激活与ISAPI_Rewrite 2.x版的兼容性，将一些2.X的规则正确地翻译为3.0版本的语法。这并不意味着ISAPI_Rewrite 3将开始懂得不经修改旧的语法。如果您有针对ISAPI_Rewrite 2.X的旧设计请使用ISAPI_Rewrite提供的翻译工具将这些旧规则转化为新的语法规则。<br />
	现在通过设置指令<i>RewriteCompatibility2</i>唯一改变的是，它将关闭网址常规前缀并删除查询字符串。 Apache的mod_rewrite将删除匹配的URL的查询字符串的这部分，相较之下ISAPI_Rewrite 2.X将匹配整个网址（包括查询字符串在内），而且[O]标记的意思将由该指令倒置。</p>
<p>
	<span style="font-size: 14pt"><b>4.14ErrorLog指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				一般的错误文件的位置</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				ErrorLog<i> file-path</i></td>
		</tr>
		<tr>
			<td>
				默认值</td>
			<td>
				ErrorLog <i>installdir\rewrite.log</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令设置存放ISAPI_Rewrite整体错误和消息的日志文件的名称。例如httpd.conf file load, .htaccess file load,等等<br />
	例：ErrorLog &quot;C:local\path\error.log&quot;</p>
<p>
	<span style="font-size: 14pt"><b>4.15LogLevel指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				设置一般的错误的日志级别</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				LogLevel <i>Level</i></td>
		</tr>
		<tr>
			<td>
				默认</td>
			<td>
				LogLevel <i>warn</i></td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令设置一般日志的输出长度，跟它的重写过程无关。这里有一个level的可用值列表：emerg、alert、crit、error、warm、notice、info、debug。当前的ISAPI_Rewrite日志只记录错误信息。<br />
	设置LogLevel调试来解决配置文件中加载的问题。</p>
<p>
	<span style="font-size: 14pt"><b>4.16&lt;VirtualHost&gt;指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				把应用于特定IP地或者主机的指令编组</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				&lt;VirtualHost addr[:port] [addr[:port]] ...&gt; ... &lt;/VirtualHost&gt;</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config</td>
		</tr>
	</tbody>
</table>
<p>
	&lt;VirtualHost&gt; ... &lt;/VirtualHost&gt;标签用来对应用到特定虚拟主机里的指令进行分组。<br />
	<i>addr</i>的可用值为：<br />
	&bull; 特定的IP地址<br />
	&bull; 完整的域名<br />
	&bull; 字符&#39;*&#39;可以匹配任何主机或者特定服务器的任何端口号。<br />
	例如：</p>
<pre>
RewriteEngine off
AllowOverride none
&lt;VirtualHost onesite.com www.onesite.com&gt;
RewriteEngine on
AllowOverride all
&lt;/VirtualHost&gt; </pre>
<p>
	不要忘了在每个&lt;VirtualHost&gt;标签中包含<i><b>RewriteEngine on</b></i>指令，也不要将不能应用的规则封装进去。</p>
<p>
	<span style="font-size: 14pt"><b>4.17&lt;Directory&gt;指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				将适用于特定的文件系统的目录和子目录的指令编组</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				&lt;Directory directory-path&gt; ... &lt;/Directory&gt;</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host</td>
		</tr>
	</tbody>
</table>
<p>
	&lt;Directory&gt; ... &lt;/Directory&gt;标签被用来对应用到特定文件系统目录以及子目录的指令进行分组。通配符?和*是可用的。正则表达式也是可用的，需要以~字符打头。<br />
	对目录路径参数必须小心：它们必须字面匹配用来访问文件的文件系统路径，用于某一特定&lt;Directory&gt;的指令并不适用于来自同一目录下通过不同的路径的文件访问，例如通过不同的符号链接。只有完整的文件路径是被允许使用的。<br />
	示例：</p>
<pre>
&lt;Directory C:/inetpub/&gt;
  AllowOverride None
&lt;/Directory&gt;
&lt;Directory C:/inetpub/home/&gt;
  AllowOverride FileInfo
&lt;/Directory&gt;
&lt;Directory ~ &quot;C:/inetpub/wwwroot/.*/[0-9]{3}&quot;&gt;
  # ... directives here ...
&lt;/Directory&gt;</pre>
<p>
	不要忘了在每个&lt;Directory&gt;标签中包含<i><b>RewriteEngine on</b></i>指令，也不要将不能应用的规则封装进去。</p>
<p>
	<span style="font-size: 14pt"><b>4.18&lt;DirectoryMatch&gt;指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				将适用于特定的文件系统的目录和子目录的指令编组</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				&lt;DirectoryMatch regex&gt; ... &lt;/DirectoryMatch&gt;</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host</td>
		</tr>
	</tbody>
</table>
<p>
	&lt;DirectoryMatch&gt; ... &lt;/DirectoryMatch&gt; 被用来封装一个只适用于指定的文件系统的目录和子目录的指令组。这个指令和&lt;Directory ~&gt; 语法相同。<br />
	示例：</p>
<pre>
&lt;DirectoryMatch &quot;^/www/(.+/)?[0-9]{3}&quot;&gt;
   # ... directives here ... 
&lt;/DirectoryMatch&gt; </pre>
<p>
	不要忘了在每个&lt; DirectoryMatch&gt;标签中包含 <b><i>RewriteEngine on</i></b>指令，也不要将不能应用的规则封装进去。</p>
<p>
	<span style="font-size: 14pt"><b>4.19&lt;Files&gt; 指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				将应用于匹配文件名的指令包装起来</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				&lt;Files <i>filename</i>&gt; ... &lt;/Files&gt;</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	&lt;File&gt;指令以文件名限定了封装的指令的作用域。<i>filename</i>参数必须包含一个文件名，支持?和*以及以~字符打头的正则表达式。<br />
	示例：</p>
<pre>
&lt;Files index.*&gt;
   # ... directives here ... 
&lt;/Files&gt;
&lt;Files ~ &quot;\.(gif|jpe?g|png)$&quot;&gt;
   # ... directives here ... 
&lt;/Files&gt;</pre>
<p>
	不要忘了在每个&lt;Files&gt;标签中包含<i><b>RewriteEngine on</b></i>指令，也不要将不能应用的规则封装进去。</p>
<p>
	<span style="font-size: 14pt"><b>4.20&lt;FilesMatch&gt;指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				将应用于匹配文件名的指令包装起来</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				&lt;FilesMatch <i>regex</i>&gt; ... &lt;/FilesMatch&gt;</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host, directory, .htaccess</td>
		</tr>
	</tbody>
</table>
<p>
	&lt;FilesMatch&gt;指令的语法和_指令&quot;&gt;&lt;Files ~&gt;语法完全一样。</p>
<pre>
&lt;FilesMatch &quot;\.(gif|jpe?g|png)$&quot;&gt; </pre>
<p>
	不要忘了在每个&lt;FilesMatch&gt;标签中包含<i><b>RewriteEngine on</b></i>指令，也不要将不能应用的规则封装进去。</p>
<p>
	<span style="font-size: 14pt"><b>4.21&lt;Location&gt;指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				把被包装起来的指令集应用到匹配的URL或者虚拟路径</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				&lt;Location <i>URL-path|URL</i>&gt; ... &lt;/Location&gt;</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host</td>
		</tr>
	</tbody>
</table>
<p>
	&lt;Location&gt; ... &lt;/Location&gt;标签用来将应用到特定URL或者虚拟路径的指令分组。&lt;Location&gt;将运算符完全从文件系统中分划出来，因此那些指令将不会用来控制对文件文件系统位置的访问。因为有几个不同的URL可能映射到相同的文件系统位置。<br />
	该<i>URL-path</i>是一个形式为&ldquo;/path/&rdquo;的虚拟路径。没有协议、主机名、端口号、查询请求字符串被包含在内。<i>URL-path</i>可以包含通配符?和*或者以~字符打头的正则表达式。<br />
	示例：</p>
<pre>
&lt;Location /directory&gt;
  # ... rules go here
&lt;/Location&gt;
&lt;Location /&gt;
   # ... more rules go here
&lt;/Location&gt;</pre>
<p>
	不要忘了在每个&lt;Location&gt;标签中包含<i><b>RewriteEngine on</b></i>指令，也不要将不需要用到的规则封套进去。</p>
<p>
	<span style="font-size: 14pt"><b>4.22&lt;LocationMatch&gt;指令</b></span></p>
<p>
	&nbsp;</p>
<table>
	<tbody>
		<tr>
			<td>
				说明</td>
			<td>
				把被包装起来的指令集应用到正则表达式匹配的URL上</td>
		</tr>
		<tr>
			<td>
				语法</td>
			<td>
				&lt;LocationMatch <i>regex</i>&gt; ... &lt;/LocationMatch&gt;</td>
		</tr>
		<tr>
			<td>
				使用环境</td>
			<td>
				server config, virtual host</td>
		</tr>
	</tbody>
</table>
<p>
	这个指令的语法和指令&quot;&gt;&lt;Location ~&gt;正则表达式语法完全一样。<br />
	示例：</p>
<pre>
&lt;LocationMatch &quot;/(home|section)/bin&quot;&gt;
   # ... rules go here
&lt;/LocationMatch&gt; </pre>
<p>
	不要忘了在每个&lt;LocationMatch&gt;标签中包含<i><b>RewriteEngine on</b></i>指令，也不要将不能应用的规则封装进去。</p>
<h3>
	示例</h3>
<div class="tCon">
	注意：这些示例中所有的规则只适用于httpd.conf文件。在ISAPI_Rewrite以及在Apache的mod_rewrite中，规则的基本路径是不同的，取决于你放置.htaccess文件的目录。如果你将规则放在httpd.conf里的话，初始领头斜线必须存在，而在.htaccess文件中，到这些文件的虚拟路径会被截断。规则取决于以RewriteBase /指令引导的根路径，来允许它们在httpd.conf和目录级的.htaccess文件的任何位置上运作。<br />
	<b>简单的搜索引擎友好的网址</b><br />
	下面这个例子演示了如何轻松地使用循环标记藏匿查询字符串参数。假设你有一个如下的URL：<b>http://www.mysite.com/foo.asp?a=A&amp;b=B&amp;c=C</b>，而且你希望以这样的地址来访问它：<b>http://www.myhost.com/foo.asp/a/A/b/B/c/C</b><br />
	请尝试用下面的规则来达到预期的效果：<br />
	<pre>
	RewriteEngine on
RewriteRule ^(.*?\.asp)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,LP,QSA]</pre>
	注意这个规则可能破坏页面与CSS文件、图片等的相对链接。至所以这样是因为在浏览器中用于推算完整资源URI的基本路径（页面的父文件夹）发生了变化。只有在您使用目录分隔符作为替代字符时才会发生这个问题。有三种可用的解决方案：<br />
	1．使用下面的规则，它不影响基本路径，因为它没有用到目录分隔符&ldquo;/&rdquo;。<br />
	2．借助于&lt;base href=&quot;/folder/&quot;&gt;标签直接为页面指定正确的base路径<br />
	3．把所有的页面相对链接都变成相对于根目录的地址或者绝对地址形式。<br />
	还存在着很多种用了不同的分隔符和文件扩展名的规则。例如，使用像这样的URL：http://www.myhost.com/foo.asp~a~A~b~B~c~C。下面的规则可以用来实现它：<br />
	<pre>
	RewriteEngine on
RewriteRule ^(.*?\.asp)~([^~]*)~([^~]*)(.*) $1$4?$2=$3 [NC,LP,QSA]</pre>
	<b>富关键词URLs</b><br />
	在上面的例子中，我们使用很一般的技术来简单地藏匿查询字符串标记。但是很多对搜索引擎优化很有用的解决方案是让您的URL关键字丰富。看看下面的网址，例如：http://www.mysite.com/productpage.asp?productID=127这是大部分网站的常见情况。但是你可以通过使用这样形式的链接来显著地提高你的网页搜索引擎抓取率：http://www.mysite.com/products/our_super_tool.asp，URL中的关键词&ldquo;our super tool&rdquo;会被索引，并提高网页排名，但是&ldquo;our_super_tool&rdquo;不能直接被用来收回productid=127，这个问题存在几种解决方案。<br />
	第一个解决方案，我们建议你使用简短、只包含少数几个参数（既有关键词也有数字标识符）的URL形式，在样您的URL可能看起来如下：<br />
	http://www.mysite.com/products/our_super_tool_127.asp。实现这一重写目标只需要一个规则：<br />
	<pre>
	RewriteEngine on
RewriteBase /
RewriteRule ^products/[^?/]*_(\d+)\.asp /productpage.asp?productID=$1 [QSA]</pre>
</div>
<p>
	另一个更复杂的解决方案是创建一对一的映射文件，并用它来映射&ldquo;our_super_tool&rdquo;到127。该解决方案对一些有很多参数的长URL来说很有用，并允许你隐藏数字标识符。这URL看起来像是http://www.mysite.com/products/our_super_tool.asp。请注意&ldquo;our_supper_tool&rdquo;部分必须是产品的唯一标识，是它的标识符。下面是这种解决方案的一个示例：</p>
<pre>
RewriteEngine on
RewriteBase /
RewriteMap mapfile txt:mapfile.txt
RewriteRule ^products/([^?/]+)\.asp /productpage.asp?productID=${mapfile:$1}</pre>
<p>
	而且你必需创建包含以下内容的mapfile.txt映射文件：</p>
<pre>
one_product       1
another_product   2
our_super_tool    127
more_products     335</pre>
<p>
	这种方法的优点是：你可以使用它来组合十分复杂的URL转换，但是这是一个小例子，是这个指南中的题外之话。<br />
	<b>使用IIS作为反向代理</b> 假设你有运行IIS的互联网服务器以及几台后台服务器或者应用程序运行在其它平台或者机器上。这些服务器不能直接在互联网上阅览，但是你必须为他人提供访问这些服务器的渠道。这里有一个演示如何简单地将某个网站的完整内容映射到另一个运行了ISAPI_Rewrite的站点的文件夹的示例：</p>
<pre>
RewriteEngine on
RewriteBase / 
RewriteRule mappoint(.+) http://sitedomain$1 [NC,P]</pre>
<p>
	<b>藏匿文件扩展名：</b> 虽然不可能将一个站点的所有的文件的扩展名都藏匿起来，但是我们可以使用ISAPI_Rewrite的文件检查功能来隐藏某些已知扩展名。这里有一个藏匿网站上.asp文件扩展名的规则示例：</p>
<pre>
RewriteEngine on
#Redirect extension requests to avoid duplicate content
RewriteRule ^([^?]+)\.asp$ $1 [NC,R=301,L]
#Internally add extensions to request
RewriteCond %{REQUEST_FILENAME}.asp -f 
RewriteRule (.*) $1.asp</pre>
<p>
	<b>仿真基于主机头的虚拟网站</b> 例如你已经注册了两个域名<b>www.site1.com</b>和<b>www.site2.com</b>。现在你可以使用同一个物理站创建两个不同的站点了。这里是一个规则示例：</p>
<pre>
RewriteEngine on
#Fix missing trailing slash char on folders
RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]
#Emulate site1
RewriteCond %{HTTP:Host} ^(?:www\.)?site1\.com$
RewriteRule (.*) /site1$1 [NC,L,NS]
#Emulate site2
RewriteCond %{HTTP:Host} ^(?:www\.)?site2\.com$
RewriteRule (.*) /site2$1 [NC,L,NS] </pre>
<p>
	现在只要把你的站点分别放到/site1和/site2目录下就可以了。注意www.site1.com和www.site2.com这两个域名必须在IIS中被映射到这个网站里，从而使ISAPI_Rewrite能拦截到请求。<br />
	或者，你可以使用更多通用的规则，从而把任何请求都映射到与请求主机名同名的文件夹里。</p>
<pre>
RewriteEngine on
#Fix missing trailing slash char on folders
RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]
#Map requests to the folders
RewriteCond %{HTTP:Host} ^(www\.)?(.+)
RewriteRule (.*) /%2$1 [NS]</pre>
<p>
	网站的目录名应该是这样子的：/somesite1.com，/somesite2.info，等等。<br />
	<b>阻断内联图像（阻止盗链）</b> 假如你有一些页面插入了<b>http://www.mysite.com/</b>下的gif图片。一些其它站点将通过网页超链接插入这些图片。这会给你的网站增加很多无用的通讯量，而且你希望阻止这种做法。<br />
	虽然用ISAPI_Rewrite不能100%地保护图片不被盗链（只有专门的反盗链产品才能做到它），你至少可以在浏览器发来HTTP引用头的时候限制这种情况。下面的规则可以让你只允许来自同一主机的引用页或者空地址访问到这些图片。</p>
<pre>
RewriteEngine on
RewriteCond %{HTTP:Host}#%{HTTP:Referer} ^([^#]+)#(?!http://\1).+
RewriteRule .*\.(?:gif|jpg|png) /block.gif [NC]</pre>
<p>
	<b>重定向非www的版本到www</b><br />
	如果你的网站同时可以通过两种形式的URL比如说http://helicontech.com和http://www.helicontech.com来访问到，那么最好将一种地址重定向到另一种地址里，来避免搜索引擎对重复内容做出的处罚。下面是一个能将所有的非www地址重定向到相应的www地址上去的301重定向规则。</p>
<pre>
RewriteEngine on
RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]</pre>
<p>
	<b>强制SSL或者非SSL到一个指定的位置</b><br />
	这里是一个演示如何将SSL强制转到指定的文件夹的示例。只要简单地把下面的规则放到该文件夹下的.htaccess文件里就可以了。</p>
<pre>
RewriteEngine on
#Fix missing trailing slash char on folders
RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]
#Redirect non-HTTPS to HTTPS
RewriteCond %{HTTP:Host} (.*)
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} (.*)
RewriteRule .? https://%1%2 [R,L]</pre>
<p>
	而这个示例作用正好相反：将非SSL强制转到指定文件夹。</p>
<pre>
RewriteEngine on
#Fix missing trailing slash char on folders
RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]
#Redirect HTTPS to non-HTTPS
RewriteCond %{HTTP:Host} (.*)
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} (.*)
RewriteRule .? http://%1%2 [R,L]</pre>
<p>
	<b>转移站点位置</b><br />
	当你把网站从一个域名移到另一个域名，或者从一个文件夹移动另一个文件夹里的时候，这是经常会遇到的问题。你希望将一个网站的所有请求重定向到另一个网站里，而且不丢失请求资源名以及参数。当你希望保留现有的网页的排名和外链接的时候，它是非常有用的。这个解决方案是在旧的网站服务器上使用ISAPI_Rewrite：</p>
<pre>
RewriteEngine on
#Permanent redirect to update old links
RewriteRule (.+) http://newserver.com$1 [R=301,L]</pre>
<p>
	<b>平衡负荷仿真</b><br />
	这个示例模拟某种DNS轮换负荷平衡技术。假设你有主站www.mysite.com和数台web服务器分别注册为www[1-9].mysite.com。如果你在主服务器上安装了ISAPI_Rewrite，你可以将初始的客户端请求重定向到几台特定服务器，从而在几台服务器之间随机摊开通讯量。一旦已重定向，客户端将一直使用这一台服务器。虽然这种解决方案并不非常理想，但是它确实能分摊你的通讯量并避免在维护会话状态方面发生的问题。<br />
	使用下面的规则来重定向客户端：</p>
<pre>
RewriteEngine on
RewriteMap hosts rnd:hosts.txt
RewriteCond %{HTTP:Host} (www)\.mysite.com [NC]
RewriteRule (.*) http://${hosts:%1}.mysite.com$1 [R,L]</pre>
<p>
	下面是hosts.txt文件的内容</p>
<pre>
www www1|www2|www3|www4|www5|www6|www7|www8|www9</pre>
<p>
	你还可以在Apeche文档里找到很多其它有用的例子。它们多数不需要修改就可以在ISAPI_Rewrite3里使用。</p>
<h3>
	故障处理</h3>
<div class="tCon">
	<span style="font-size: 14pt"><b>Chapter 6故障处理</b></span><br />
	在这里你可以一步步找到你在安装ISAPI时遇到的问题的解决方法。<br />
	1.首先要正确解决您的问题，我们需要你运行最新的可用版本的ISAPI_Rewrite软件。你可以随时到我们的网站下载最新版的软件来升级你的ISAPI_Rewrite。地址是<a href="http://www.helicontech.com/download-isapi_rewrite3.htm" target="_blank">http://www.helicontech.com/download-isapi_rewrite3.htm</a> 。<br />
	2.多数运行ISAPI_Rewrite的问题发生在服务器上NTFS权限限制上。所以，请先阅读需要运行ISAPI_Rewrite文件的权限。<br />
	3.请检查应用程序和系统日志中的错误信息。这可能指出您的错误原因。<br />
	4.不要忘记设置RewriteEngine on指令在你所用的每个配置文件中。<br />
	5.把下列代码行放到httpd.conf文件中：<br />
	<pre>
	RewriteLogLevel 9
LogLevel debug</pre>
	它将创建error.log和rewrite.log两个日志文件，默认放在安装目录下。如果日志文件被创建了，它表明ISAPI_Rewrite正在运行。阅读作为结果的error.log和rewrite.log文件，将能告诉你一些问题的根源线索。<br />
	6.如果httpd.conf规则正在生效，但是.htaccess文件却没有载入，请再次检查.htaccess文件的NTFS权限，并确保你没有在使用ISAPI_Rewrite的精简版。<br />
	7.如果规则在httpd.conf里能生效，但是有其它部分或者.htaccess文件里不能生效，请确保在每个部分的或者.htaccess文件里包含RewriteEngine on指令。同样的，不要忘掉.htaccess文件里的默认rewriting base值与httpd.conf是不同的。在.htaccess文件里或者&lt;Directory&gt;部分里，ISAPI_Rewrite会自动从路径中剥离本地目录前缀并只对剩下的部分应用规则。所以如果你的规则以&ldquo;/&rdquo;字符开头的话，在网站根目录的.htaccess文件中它必须被去掉。<br />
	如果你在使用ISAPI_Rewrite时依然有问题，请到技术支持论坛里来写下你的问题，或者发送电子邮件到技术支持邮箱里。<br />
	请在您的支持请求里包括以下信息：<br />
	1.您的ISAPI_Rewrite配置文件，包括路径和文件名。<br />
	2.您的网站的地址链接。<br />
	3.你用到测试你的规则的URL。<br />
	4.与失败的请求error.log和rewrite.log的文件副本。<br />
	5.包括失败的请求的部分IIS日志文件。<br />
	请记住你提供的信息越多，我们越容易为你解决问题。这样你更有机会快速地得到解决方案。</div>
<p>
	ISAPI_Rewrite 发布历史<br />
	发布 3.1.0.67<br />
	================<br />
	[筛选器功能] 增强映射文件的动态加载<br />
	[代理帮助文件错误]如果后端不设置内容长度头的话，并不会返回所有的响应。<br />
	发布 3.1.0.66<br />
	================</p>
<p>
	<b><br />
	</b></p>
<p>
	<b>精简版的限制</b><br />
	ISAPI_Rewrite的精简版拥有相同的引擎和重写功能。但是也有下面这些限制：<br />
	不支持分布式.htaccess配置、目录以及网站级配置，只有一个精简版安装目录中的全局的httpd.conf配置能被载入。<br />
	不支持&lt;VirtualHost&gt;、&lt;Directory&gt;、&lt;DirectoryMatch&gt;、&lt;Files&gt;、&lt;FilesMatch&gt;、&lt;Location&gt; 以及&lt;LocationMatch&gt;这几个标签。<br />
	精简版中没有代理服务模块，因而所有的和代理服务功能相关的比如说RewriteProxy指令以及[P]标记都会被忽略。<br />
	精简版没有针对于虚拟主机环境的手工安装包<br />
	ISAPI_Rewrite精简版完全免费，它对开发或者测试目的以及只有几个网站而且不需要分布式配置或者代理功能的小型服务器来说是一个很好的解决方案</p>
<p>
	<b>技术信息</b> ISAPI_Rewrite由四个部分组成：ISAPI筛选器、ISAPI扩展帮助、GUI管理器以及MMC嵌入式管理单元扩展。ISAPI_Rewrite筛选器和扩展都是用纯C++语言写的快速DLL模块。当安装ISAPI_Rwrite的时候， MMC嵌入式管理单元会被自动注册。ISAPI筛选器将安装在一个全局级别上，你不需要手工注册它。ISAPI扩展也会被安装并注册。<br />
	ISAPI_Rewrite管理器实用工具可以在没有安装MMC的系统中运行ISAPI_Rewrite MMC嵌入式管理单元。<br />
	Windows Vista以及Windows Server 2008系统中的ISAPI_Rewrite管理器实用工具(Helicon Manager.exe)要求管理员权限来执行，因为较小权限的用户没有权力读取IIS管理元库，而它对显示网站配置来说是必需的。如果用受限的帐号运行ISAPI_Rewrite管理器，你会得到登录管理员帐号的自动提示。<br />
	ISAPI_Rewrite筛选器已经有足够地快，因此不用担心它的性能。除非你的服务器运行在最大负荷之下。用户在响应时间或者CPU负荷方面几乎不能发现什么区别，但是如果用了很多的规则的话，服务器最大带宽可能掉下一点来。所以请注意你用的配置决定了性能。建议每个网站使用的规则不要超过100条。在多数情况下，可以利用RewriteMap来避免使用大量的规则。<br />
	该程序使用了Regex++ 库。<br />
	Regex++ (Version Boost 1.31)<br />
	Copyright ?1998-2004, Dr John Maddock</p>
<p>
	<b>使用和传播许可</b><br />
	该使用许可覆盖了所有的现有版本的ISAPI_Rewite，包括ISAPI_Rewrite、ISAPI_Rewrite完全版、ISAPI_Rewrite精简版、ISAPI_Rewrite测试版，后面统称为ISAPI_Rewrite除非另有指明。<br />
	1.所有未明确授予的权利均由Helicon Tech保留。<br />
	2.所有的关于ISAPI_Rewrite的版权都由它的作者Helicon Tech独家保留。<br />
	3. Helicon Tech准予免费使用ISAPI_Rewrite精简版产品。<br />
	4. Helicon Tech准予免费试用ISAPI_Rewrite产品30天，当试用期结束时，请要么购买ISAPI_Rewrite，要么删除ISAPI_Rewrite产品。<br />
	5.未注册过的ISAPI_Rewrite试用版，可以在不被改动的前提下自由传播，除非有下例情况。任何个人或者公司都不用为在未得版权持有人书面许可的情况下传播ISAPI_Rewrite而付费。未经版权持有者的书面许可，未注册的试用版ISAPI_Rewrite不允许捆绑其它安装包。<br />
	6. ISAPI_Rewrite必须被原样传播，不提供任何形式的保证明示或暗示。你可以在你自己的磁盘上使用ISAPI_Rewrite。作者不为因为滥用本软件导致的数据丢失、损坏，或任何其他类型的损失承担责任。<br />
	7.你不得使用、复制、模仿、克隆、出租、出售、修改、反编译、反汇编以及其它任何反向工程，或者转让许可程序，或者任何许可程序的一个子集，除非本协议有提供。任何未经授权的使用将导致本许可自动终止。并可能导致刑事或民事起诉。<br />
	8.本许可协议的条款是在未来版本的ISAPI_Rewrite将会有所变化。<br />
	9.当你购买ISAPI_Rewrite时，将发给你&ldquo;注册码&rdquo;。这种&ldquo;注册码&rdquo;可以个人或者公司购买，并只在一台计算机上使用。如果您购买一个以上的ISAPI_Rewrite副本，发给你们的&ldquo;注册码&rdquo;只能在等于你购买的许可证数的计算机上使用。<br />
	10.您只能使用来自Helicom Tech以及与Helicom Tech有业务合作或者技术合作的公司的注册码。<br />
	11. 安装和使用ISAPI_Rewrite意味着接受这些条款及许可条件。<br />
	12. 如果您不同意本许可证的条款或违反本许可与您当地的法律规定，您必须从您的存储设备中删除ISAPI_Rewrite文件，并停止使用该产品。<br />
	13.我们坚持严格的隐私的准则，不会收集个人识别信息，除非是自愿提供的。<br />
	如果您有进一步的问题或意见，请访问我们的http://www.helicontech.com。<br />
	感谢你使用ISAPI_Rewrite。<br />
	Helicon Tech Corporation.</p>
]]></description>
			<link>http://www.reynaldliu.net/archives/12/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<category domain="http://www.reynaldliu.net/tag/wp%E9%87%8D%E5%86%99/">wp重写</category>
			<category domain="http://www.reynaldliu.net/tag/wprewrite/">wprewrite</category>
			<category domain="http://www.reynaldliu.net/tag/iis%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/">iis反向代理</category>
			<category domain="http://www.reynaldliu.net/tag/wordpress%E9%87%8D%E5%86%99/">wordpress重写</category>
			<category domain="http://www.reynaldliu.net/tag/iis%E9%87%8D%E5%86%99%E7%BB%84%E4%BB%B6%E5%85%8D%E8%B4%B9%E7%A0%B4%E8%A7%A3/">iis重写组件免费破解</category>
			<category domain="http://www.reynaldliu.net/tag/isapi_rewrite3.1%E7%A0%B4%E8%A7%A3/">isapi_rewrite3.1破解</category>
			<pubDate>Tue, 17 Aug 2010 15:32:39 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/11/</link>
			<guid>http://www.reynaldliu.net/archives/11/</guid>
			<title>罗兰德再次制造无损迁移IIS(含匿名帐号,ntfs,acl,用户同步) For Win2003 and Win2008</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	这个命令会自动将你的iis配置，就是metebase.xml中的内容，完完整整复制到目标服务器。<br />
	并且站点物理文件也会复制过去，所以目标服务器上的盘符啊，容量啊分布一定要一样才可以成功。<br />
	对IIS网站而言可说得上是一一复制了。<br />
	而IIS站点中的用户和密码可以通过修改C:\Inetpub\AdminScripts\adsutil.vbs中显示星号的issec改为false来解决。<br />
	这一点进行遍历就行了。<br />
	w3svc/站点编号/root/AnonymousUserName<br />
	w3svc/站点编号/root/AnonymousUserPass</p>
<div>
	然后再通过net user 取得的AnonymousUserName 取得的AnonymousUserPass /add<br />
	来进行。最后进行setacl.bat（这个文件在我发过的rsync同步那个方法文章中有）来配置acl,ntfs权限即可了。比上一次的同步方法简单。并且工具是微软自己的，支持度肯定比rsync要好了。</div>
<div>
	并且支持两台服务器iis之间无缝合并，iis6到iis7无缝升级</div>
<div>
	<br />
	msdeploy -verb:sync -source:webserver60,computername=源服务器IP,userName=超管用户名,password=密码 -dest:webserver60</div>
<div>
	<br />
	iis6迁移到iis7(win2003到win2008升级)<br />
	msdeploy -verb:sync -source:webserver60,computername=服务器IP,userName=超管用户名,password=密码 -dest:webserver<br />
	不支持以下形式<br />
	就是iis7降级为iis6是不被允许的。<br />
	msdeploy -verb:sync -source:webserver,computername=服务器IP,userName=超管用户名,password=密码 -dest:webserver60</div>
<div>
	&nbsp;</div>
<div>
	其实这个工具老早就带在微软的开发工具中叫发布布署工具.用visual studio开发过项目并且用过他布署项目上线的不会陌生。只不过他是全图形的。本文给出的操作是全命令行的。</div>
<div>
	&nbsp;</div>
<div>
	相比上一次制造给出了详细的操作方法和文件，这一次只是略微给出思路，因为具体起来可以看help文档。照着做就行了。没啥难度。</div>
<div>
	下载在这里</div>
<div>
	<a href="http://www.iis.net/download/WebDeploy">http://www.iis.net/download/WebDeploy</a></div>
<div>
	2008r2服务器下载64位，2003下载x86。</div>
]]></description>
			<link>http://www.reynaldliu.net/archives/11/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<category domain="http://www.reynaldliu.net/tag/iis6%E5%AF%BCiis7/">iis6导iis7</category>
			<category domain="http://www.reynaldliu.net/tag/iis6%E5%8D%87%E7%BA%A7/">iis6升级</category>
			<category domain="http://www.reynaldliu.net/tag/iis%E8%BF%81%E7%A7%BB/">iis迁移</category>
			<category domain="http://www.reynaldliu.net/tag/iis%E5%90%88%E5%B9%B6/">iis合并</category>
			<category domain="http://www.reynaldliu.net/tag/iis%E5%90%8C%E6%AD%A5/">iis同步</category>
			<category domain="http://www.reynaldliu.net/tag/msdeploy/">msdeploy</category>
			<pubDate>Thu, 24 Jun 2010 18:35:18 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/10/</link>
			<guid>http://www.reynaldliu.net/archives/10/</guid>
			<title>某程序的核心函数解密方法大揭密</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	叫你不早点来看，本文已经被和谐了。来晚了吧？傻了吧？</p>
]]></description>
			<link>http://www.reynaldliu.net/archives/10/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<pubDate>Thu, 10 Jun 2010 16:29:22 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/9/</link>
			<guid>http://www.reynaldliu.net/archives/9/</guid>
			<title>[转载]批处理简述</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	　1.综述</p>
<div>
	　　(1)、 &ldquo;.bat&rdquo;: 这是微软的第一个批处理文件的后缀名，在几乎所有的Windows 操作系统内都能运行。</div>
<div>
	　　(2)、　 &ldquo;.cmd&rdquo;: 是为Windows NT 设计的命令行脚本， 为Cmd.exe shell而设计的， 对于COMMAND.COM不具有向后兼容性。</div>
<div>
	　　(3)、目前所知道的.cmd 和 .bat文件的区别是对ERRORLEVEL变量的改变：当Command Extensions （命令行扩展）处于enabled状态时，哪怕是.cmd文件中一个成功执行的命令都可以改变ERRORLEVEL的值，而在.bat 文件中ERRORLEVEL 变量只有在遇到错误的时候才发生改变。</div>
<div>
	　　<a href="mailto:2.@echo">2.@echo</a> off/echo on</div>
<div>
	　　(1). &ldquo;echo&rdquo; 用来在控制台上显示信息。</div>
<div>
	　　(2). &ldquo;echo.&rdquo; 用来显示一空行。（注意：echo和右下角的点之间没有空格，如果有空格就变成显示句点了。）</div>
<div>
	　　(3). &ldquo;echo off&rdquo;: 在使用了这行命令之后，其他命令都只显示命令的结果，而不显示命令本身。</div>
<div>
	　　(4). &ldquo;echo on&rdquo;: 这是默认值，表示显示所有的命令结果和命令行本身。</div>
<div>
	　　(5).&ldquo;echo&rdquo;: 当执行echo而不带任何参数的时候，会显示echo的打开或关闭的状态：&ldquo;ECHO is on&rdquo; 或者 &ldquo;ECHO is off&rdquo;。</div>
<div>
	　　(6). &ldquo;@&rdquo;:@ 符号表示不显示本行的命令本身。如果只用echo off，虽然echo off后面的命令不显示出来，只显示命令的结果，但是echo off它自己确被显示出来了，这就是使用@echo off的原因。</div>
<div>
	　　3.SETLOCAL/ENDLOCAL</div>
<div>
	　　(1). SETLOCAL用来控制批处理文件中变量的可见性。就是高级语言常说的局部变量。凡是在SETLOCAL和ENDLOCAL之间的变量都是局部的，以免被其他脚本文件改变变量的值，而没有使用这个标示的都是Global visible（全局变量），很可能被其他文件所改变。下面的例子很好的说明了这一点。</div>
<div>
	@echo　off<br />
	setlocal　<br />
	set　version=1.0<br />
	echo　the　first　version　is　%version%<br />
	endlocal<br />
	echo　the　second　version　is　%version%<br />
	::The　follow　is　global　variable<br />
	set　version=2.0<br />
	echo　the　third　version　is　%version% 　　执行这个文件，将输出：</div>
<div>
	the　first　version　is　1.0<br />
	the　second　version　is<br />
	the　third　version　is　2.0</div>
<div>
	　　第二个version是全局变量，但是没有定义，所以是空值。再次执行：</div>
<div>
	the　first　version　is　1.0<br />
	the　second　version　is　2.0<br />
	the　third　version　is　2.0<br />
	&nbsp;<br />
	@echo　off<br />
	setlocal　<br />
	set　version=1.0<br />
	echo　the　first　version　is　%version%<br />
	endlocal<br />
	echo　the　second　version　is　%version%<br />
	::The　follow　is　global　variable<br />
	set　version=5.0<br />
	echo　the　third　version　is　%version% 　　执行第二个文件：</div>
<div>
	the　first　version　is　1.0<br />
	the　second　version　is　2.0<br />
	the　third　version　is　5.0</div>
<div>
	　　再次执行：</div>
<div>
	the　first　version　is　1.0<br />
	the　second　version　is　5.0<br />
	the　third　version　is　5.0<br />
	&nbsp;</div>
<div>
	<br />
	　　由此可见变量的作用域在简单的批处理文件还是很慎重，否则可以造成千变万化的结果，这样这个脚本就很不稳定了。所以，变量作用域很重要，得注意。</div>
<div>
	　　(2). EnableDelayedExpansion. （参考百度：<a href="http://baike.baidu.com/view/2923132.htm">http://baike.baidu.com/view/2923132.htm</a> ）</div>
<div>
	　　代码<br />
	　　结果<br />
	&nbsp;<br />
	@echo　off<br />
	setlocal<br />
	set　var=test　&amp;　echo　show　%var%<br />
	endlocal<br />
	　　show</div>
<div>
	　　当解析到%var%是，CMD还没有执行完任何语句，所以系统并不认识这个变量，所以认为变量没有定义，所以显示空值。<br />
	&nbsp;<br />
	@echo　off<br />
	Setlocal　ENABLEDELAYEDEXPANSION<br />
	set　var=test　&amp;　echo　show　!var!<br />
	endlocal<br />
	　　show test</div>
<div>
	　　使用了变量延迟扩展，并使用!var!，其实在执行的时候也不认识这个变量，但是这条语句执行完以后，仍然返回去赋值。这种事后处理，就是变量延迟扩展。<br />
	&nbsp;</div>
<div>
	　　For语句看起来写了很多行，其实认为是一条语句。所以如果在没有使用变量延迟扩展的时候，在For语句里的每一行，都只是记忆着系统所记忆的东西。而使用了变量延迟扩展之后，会执行完了整条语句，再&ldquo;事后处理&rdquo;给与赋值，然后才显示到控制台。下面的例子很能说明问题。<br />
	&nbsp;<br />
	@echo　off<br />
	setlocal<br />
	::　count　to　5<br />
	set　_tst=0<br />
	FOR　/l　%%G　in　(1,1,5)　Do　(echo　[%_tst%]　&amp;　set　/a　_tst+=1)<br />
	echo　Total　=　%_tst% [0]<br />
	[0]<br />
	[0]<br />
	[0]<br />
	[0]<br />
	Total　=　5<br />
	@echo　off<br />
	setlocal<br />
	::　count　to　5<br />
	set　_tst=0<br />
	FOR　/l　%%G　in　(1,1,5)　Do　(echo　[!_tst!]　&amp;　set　/a　_tst+=1)<br />
	echo　Total　=　!_tst! [0]<br />
	[1]<br />
	[2]<br />
	[3]<br />
	[4]<br />
	Total　=　5<br />
	　 　 　</div>
<div>
	<br />
	　　在CMD里面，系统使用&ldquo;^&rdquo;作为脱字符。使用变量延迟扩展ENABLEDELAYEDEXPANSION之后，脱字符^ 就可以一直产生作用，而不再局限于一个命令行。这样对于处理包含HTML和XML格式的字符的时候，就方便多了。请看下面的例子。</div>
<div>
	　　@echo off</div>
<div>
	　　REM 这个文件会创建World.txt到本地磁盘，文件内容为Hello。</div>
<div>
	　　REM 也就是第二次运行的时候，脱字符没有发挥作用。</div>
<div>
	SETLOCAL　<br />
	Set　_html=　Hello^&gt;World.txt<br />
	Echo　%_html%<br />
	ENDLOCAL</div>
<div>
	　　@echo off</div>
<div>
	　　REM 这个文件会输出Hello&gt;World.txt，脱字符一直产生作用。</div>
<div>
	SETLOCAL　EnableDelayedExpansion<br />
	Set　_html=　Hello^&gt;World.txt<br />
	Echo　!_html!<br />
	ENDLOCAL<br />
	@echo　off</div>
<div>
	　　REM 使用变量延迟扩展来处理html语句。</div>
<div>
	SETLOCAL　EnableDelayedExpansion<br />
	Set　_html=html　format:　^&lt;title^&gt;Hello　world^&lt;/title^&gt;<br />
	Echo　!_html!<br />
	ENDLOCAL</div>
<div>
	　　(3). DISABLEEXTENSIONS.</div>
<div>
	　　值得注意的是，这里的扩展不是扩展名，而是命令的扩展功能，比如 &ldquo;/F&rdquo; 参数就是For循环的命令扩展。</div>
<div>
	　　只有使用了命令扩展我们才能执行下面的语句。</div>
<div>
	　　FOR /F &quot;DELIMS=&quot; %%a IN (test.TXT) DO @echo %%a</div>
<div>
	　　否则我们要输出一个文件，只能使用Type test.txt了。命令扩展默认是开启的。</div>
<div>
	　　4.Set</div>
<div>
	　　(1). SET 不带任何参数: 将显示当前用户的所有系统环境变量。(set)</div>
<div>
	　　(2). SET 带一个变量名: 尝试搜索并显示以这个变量名开头的环境变量。（set PROCESSOR就会显示以PROCESSOR开始的变量）</div>
<div>
	　　(3). SET variable=string: 给一个变量赋值。</div>
<div>
	　　(4). SET &ldquo;&rdquo;: 使用一对空的双引号，会显示一个不带参数的情况下没显示出来的变量。我这里就显示下面两个奇怪的变量。</div>
<div>
	　　=C:=C:\Users\Lingli</div>
<div>
	　　=E:=E:\Powershell</div>
<div>
	　　使用cd %=C:%还真可以转到C:\Users\Lingli目录下。</div>
<div>
	　　(5). SET &ldquo;var=&rdquo;(or SET var=): 删除一个变量。</div>
<div>
	　　(6). SET /A variable=expression: 使用算数运算符来给变量赋值。</div>
<div>
	　　()　　　　　　　　　　　　　　　　　 - 组合</div>
<div>
	　　! ~ -　　　　　　　　　　　　　　 - 一元操作符</div>
<div>
	　　* / %　　　　　　　　　　　　　　 - 算数运算符</div>
<div>
	　　+ -　　　　　　　　 　　　　　　　　-算数运算符</div>
<div>
	　　&lt;&lt; &gt;&gt;　　　　　　　　　　　　　　 - 逻辑偏移</div>
<div>
	　　&amp;　　　　　　　　　　　　　　　　　　 - 位与</div>
<div>
	　　^　　　　　　　　　　　　　　　　　　 - 位异或</div>
<div>
	　　|　　　　　　　　　　　　　　　　　　 - 位或</div>
<div>
	　　= *= /= %= += -=　　　 - 赋值</div>
<div>
	　　&amp;= ^= |= &lt;&lt;= &gt;&gt;=</div>
<div>
	　　(7). SET /P variable=[提示字符]:提示用户输入并把输入的值赋给variable。提示字符可以为空。有时可以使用CHOICE来代替SET /P.</div>
<div>
	@echo　off<br />
	setlocal<br />
	set　/p　version=Please　enter　the　QQ　version:<br />
	echo　you　will　install　QQ　%version%<br />
	endlocal</div>
<div>
	　　(8). 有用的环境变量。</div>
<div>
	　　%CD% - 当前路径名。</div>
<div>
	　　%DATE% - 当前日期。</div>
<div>
	　　%TIME% - 当前时间。</div>
<div>
	　　%RANDOM% - 显示0 到32767之间的一个随机数。你看CMD也是可以获取随机数的。</div>
<div>
	　　5.Choice</div>
<div>
	　　(1). 详细语法：</div>
<div>
	<br />
	　　CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]</div>
<div>
	　　该命令可以提供用户一个选择列表，并使用ERRORLEVEL参数返回用户选择项的序号。第一项对于1，第二项对应 2，依次类推，如果用户按CTRL+C退出而不选择，就返回0。<br />
	&nbsp;<br />
	　　/C　　　 choices</div>
<div>
	　　/N</div>
<div>
	　　/CS</div>
<div>
	　　/T　　　 timeout</div>
<div>
	　　/D　　　 choice</div>
<div>
	　　/M　　　 text<br />
	&nbsp;　　用字母列出所提供的选项，默认是&quot;YN&quot;，即是和否。</div>
<div>
	　　隐藏选择列表。如果使用这个选项，那么提示的文字里最后写清楚以下。不推荐使用。</div>
<div>
	　　激活大小写敏感。默认是对大小写不敏感。</div>
<div>
	　　选择超时设置。</div>
<div>
	　　超时后的默认选项。</div>
<div>
	　　提示字符。最好把要选择的问题将清楚。<br />
	&nbsp;</div>
<div>
	<br />
	　　(2). 例子:</div>
<div>
	@echo　off<br />
	SETLOCAL<br />
	CHOICE　/C　ABC　/M　&quot;选择登陆用户：A　-　管理员；B　域用户；C注册用户&quot;<br />
	IF　%errorlevel%==1　goto　:Admin　<br />
	IF　%errorlevel%==2　goto　:Domain<br />
	IF　%errorlevel%==3　goto　:Local<br />
	goto　Exit<br />
	　<br />
	:Admin<br />
	　　　　echo　欢迎管理员<br />
	　　　　goto　Exit<br />
	　<br />
	:Domain<br />
	　　　　echo　欢迎域用户<br />
	　　　　goto　Exit<br />
	　<br />
	:Local<br />
	　　　　echo　欢迎注册用户<br />
	　　　　goto　Exit<br />
	　<br />
	:Exit<br />
	endlocal</div>
<div>
	　　6.Rem and Arguments.</div>
<div>
	　　(1). REM [comment]: 批处理文件的注释符，可以使用&ldquo;::&rdquo; 来代替REM。</div>
<div>
	　　(2). 参数。</div>
<div>
	　　%0对应文件名本身，其他分别对应一个参数值，支持255个参数。</div>
<div>
	　　Test.cmd 　　1 　　2 　　3 　　&hellip; 　　n 　　&hellip; 　　255<br />
	　　%0 　　%1 　　%2 　　%3 　　&hellip; 　　%n 　　&hellip; 　　%255</div>
<div>
	<br />
	　　(3). 文件名参数扩展。</div>
<div>
	　　当使用文件名作参数的时候，可以使用如下文件名扩展。下面的例子扩展%1，其实对所有的参数都可以进行类似的扩展。</div>
<div>
	%~f1 - 扩展%1 为带路径的全名。<br />
	%~d1 - 只显示磁盘名称。<br />
	%~p1 - 只显示文件路径。<br />
	%~n1 - 只显示文件名，不包括后缀名，也不包括路径。<br />
	%~x1 - 只显示后缀名。<br />
	%~s1 - 变成短文件名，将包含&ldquo;~&rdquo;符号。<br />
	%~1 - 有时候文件名包含空格是，会对文件名加双引号。这个功能是去掉双引号。<br />
	%~a1 - 显示文件的属性。<br />
	%~t1 - 显示文件的修改时间。<br />
	%~z1 - 显示文件的大小。<br />
	　</div>
<div>
	　　上面的扩展是可以组合的:</div>
<div>
	　　%~dp1 - 扩展%1 为磁盘名称和路径名。</div>
<div>
	　　%~nx2 - 扩展%2 为文件名和文件后缀名。</div>
<div>
	::Test.bat<br />
	::Example:　test.bat　test.bat<br />
	@echo　off<br />
	setlocal<br />
	set　fn=%~f1<br />
	echo　%fn%<br />
	endlocal</div>
<div>
	　　7.IF 语句</div>
<div>
	　　(1). 详细语法：</div>
<div>
	File　syntax　　　<br />
	IF　[NOT]　EXIST　filename　command　<br />
	IF　[NOT]　EXIST　filename　(command)　ELSE　(command)<br />
	　<br />
	String　syntax　　　<br />
	IF　[/I]　[NOT]　item1==item2　command　<br />
	IF　[/I]　item1　compare-op　item2　command<br />
	IF　[/I]　item1　compare-op　item2　(command)　ELSE　(command)<br />
	　<br />
	Error　Check　Syntax<br />
	IF　[NOT]　DEFINED　variable　command<br />
	IF　[NOT]　ERRORLEVEL　number　command　<br />
	IF　CMDEXTVERSION　number　command</div>
<div>
	　　Key</div>
<div>
	　　/I　　　　　　　　 : 比较时不考虑文件名大小写，即大小写不敏感。</div>
<div>
	　　compare-op : 逻辑比较</div>
<div>
	　　EQU : equal 等于</div>
<div>
	　　NEQ : not equal 不等于</div>
<div>
	　　LSS : less than 小于</div>
<div>
	　　LEQ : less than or equal小于或等于</div>
<div>
	　　GTR : greater than 大于</div>
<div>
	　　GEQ : greater than or equal大于或等于</div>
<div>
	　　(2). 例子(可以看出If语句也是一条语句)</div>
<div>
	　　IF EXIST filename (del filename) ELSE ( echo The file was not found.)</div>
<div>
	IF　EXIST　filename　(<br />
	del　filename<br />
	)　ELSE　(　<br />
	echo　The　file　was　not　found.<br />
	)</div>
<div>
	　　8.For 循环</div>
<div>
	　　(1). 详细语法：</div>
<div>
	FOR-Files<br />
	FOR　%%parameter　IN　(set)　DO　command　<br />
	　<br />
	FOR-Files-Rooted　at　Path　　　<br />
	FOR　/R　[[drive:]path]　%%parameter　IN　(set)　DO　command　<br />
	　<br />
	FOR-Folders<br />
	FOR　/D　%%parameter　IN　(folder_set)　DO　command　<br />
	　<br />
	FOR-List　of　numbers　　　<br />
	FOR　/L　%%parameter　IN　(start,step,end)　DO　command　<br />
	　<br />
	FOR-File　contents　　　<br />
	FOR　/F　[&quot;options&quot;]　%%parameter　IN　(filenameset)　DO　command　<br />
	FOR　/F　[&quot;options&quot;]　%%parameter　IN　(&quot;Text　string　to　process&quot;)　DO　command<br />
	　<br />
	FOR-Command　Results　<br />
	　　　　　　　FOR　/F　[&quot;options&quot;]　%%parameter　IN　(&#39;command　to　process&#39;)　DO　command</div>
<div>
	　　eol=c　　　　　　　　　　 - 行首注释符。如果有这个注释符，这一行不做处理。</div>
<div>
	　　skip=n　　　　　　　　 - 制定前n行跳过，不处理</div>
<div>
	　　delims=xxx　　　　　 - 分隔符集合。默认分隔符是空格和Tab。</div>
<div>
	　　tokens=x,y,m-n　- 选择哪一块用于循环操作。</div>
<div>
	　　usebackq　　　　　 - 当文件名有空格需要使用双引号时，使用usebackq把双引号内的东西当文件处理，否则当字符串处理。</div>
<div>
	　　注意:</div>
<div>
	　　在批处理文件中，参数使用%%parameter，而当你拿到命令行使用的时候，使用%parameter，就是一个百分号的区别。同时变量名区分大小写，所以%g和G是不相同的。</div>
<div>
	　　(set)　说明是文件集合，一个文件或多个文件，还可以对文件名使用通配符。</div>
<div>
	　　(2). 例子：</div>
<div>
	@echo　off<br />
	setlocal<br />
	for　%%G　in　(*.bat　*.txt)　do　echo　%%G<br />
	endlocal</div>
<div>
	　　9.Net.</div>
<div>
	　　(1). 管理服务: Net start, stop, pause, continue [service]。</div>
<div>
	　　(2). 连接到一个共享文件：Net use。</div>
<div>
	　　　　　　　 NET USE [磁盘名:] \\共享名称[\子目录名] [密码] [/USER:[域名\]用户名]</div>
<div>
	　　　　　　　 NET USE磁盘名:]: /delete</div>
<div>
	　　(3). Net share: 显示本地的所有共享，包括隐藏的共享。</div>
<div>
	　　(4). Net share ShareName: 显示共享的相关信息。</div>
<div>
	　　(5). 创建一个本地共享: NET SHARE sharename=drive:path /REMARK:&quot;text&quot; [/CACHE:Manual | Automatic | No ]</div>
<div>
	　　(6). 修改用户数量限制和标示。</div>
<div>
	　　　　　　　 NET SHARE sharename /USERS:number /REMARK:&quot;text&quot;</div>
<div>
	　　　　　　　 NET SHARE sharename /UNLIMITED /REMARK:&quot;text&quot;</div>
<div>
	　　(7). 删除共享: NET SHARE {sharename | devicename | drive:path} /DELETE</div>
<div>
	　　(8). Net view \\计算机名: 列出远程机器的所有共享。</div>
<div>
	　　(9). Net localgroup: 把一个账户加入一个本地组，如加入管理员组：net localgroup administrators DomainName\UserName /add</div>
<div>
	　　(10). 机器重命名: netdomrenamecomputer 原机器名 /newname:修改后的机器名 /UserD:user /PasswordD:password</div>
<div>
	　　(11). 加入域: net dom join 计算机名/domain:域名 /UserD:域管理员账户 /PasswordD:域管理员密码</div>]]></description>
			<link>http://www.reynaldliu.net/archives/9/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<pubDate>Thu, 03 Jun 2010 14:27:27 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/8/</link>
			<guid>http://www.reynaldliu.net/archives/8/</guid>
			<title>WAP手机网站制作,多终端页面导入自适应（主要手机和PC）</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <pre class="brush:vb;">
&lt;%
htm = &quot;index.html&quot;
wap = &quot;index.wml&quot;
wap2 = &quot;index.htm&quot;
agent=request.ServerVariables(&quot;HTTP_USER_AGENT&quot;)
Accept = request.ServerVariables(&quot;HTTP_ACCEPT&quot;)
isWAP = false
     if (Instr(ucase(Accept),ucase(&quot;wap&quot;)) or  Instr(ucase(Accept),ucase(&quot;wml&quot;))) then
      isWAP = true
     else
     brow = left(agent,4)
   if (ucase(brow)=ucase(&quot;Noki&quot;) or ucase(brow)=ucase(&quot;Eric&quot;) or ucase(brow)=ucase(&quot;R380&quot;) or ucase(brow)=ucase(&quot;MOT-&quot;) or ucase(brow)=ucase(&quot;UPG1&quot;) or ucase(brow)=ucase(&quot;Jing&quot;) or ucase(brow)=ucase(&quot;Acoo&quot;) or ucase(brow)=ucase(&quot;Wapt&quot;) or ucase(brow)=ucase(&quot;QWAP&quot;) or ucase(brow)=ucase(&quot;m-cr&quot;) or ucase(brow)=ucase(&quot;MC21&quot;) or ucase(brow)=ucase(&quot;Your&quot;) or ucase(brow)=ucase(&quot;YOUR&quot;) or ucase(brow)=ucase(&quot;w@pS&quot;) or ucase(brow)=ucase(&quot;Alca&quot;) or ucase(brow)=ucase(&quot;wapw&quot;) or ucase(brow)=ucase(&quot;Rain&quot;) or ucase(brow)=ucase(&quot;Java&quot;) or ucase(brow)=ucase(&quot;AUR &quot;) or ucase(brow)=ucase(&quot;UP.B&quot;) or ucase(brow)=ucase(&quot;WAPm&quot;) or ucase(brow)=ucase(&quot;WinW&quot;) or ucase(brow)=ucase(&quot;WapI&quot;) or ucase(brow)=ucase(&quot;WAPJ&quot;) or ucase(brow)=ucase(&quot;WapV&quot;) or ucase(brow)=ucase(&quot;4thp&quot;) or ucase(brow)=ucase(&quot;Waps&quot;) or ucase(brow)=ucase(&quot;Mits&quot;) or ucase(brow)=ucase(&quot;SIE-&quot;) or ucase(brow)=ucase(&quot;Aptu&quot;) or ucase(brow)=ucase(&quot;WmlS&quot;) or ucase(brow)=ucase(&quot;Wapa&quot;)) then
       isWAP = true
    end if
    end if
       isWAP2 = false
     if (isWAP) then
       if (Instr(ucase(Accept),ucase(&quot;xhtml&quot;))) then
         isWAP2 = true
     end if
  end if
   if (isWAP2) then
    response.Redirect(wap2)
   elseif (isWAP) then
    response.Redirect(wap)
   else
    response.Redirect(htm)
   end if
%&gt;
&lt;p&gt;本页没有跳转,请手工选择您的线路&lt;/p&gt;
&lt;a href=&quot;/index.wml&quot;&gt;低端手机wap&lt;/a&gt;&lt;a href=&quot;/index.htm&quot;&gt;高端手机xhtml&lt;/a&gt;&lt;a href=&quot;/index.html&quot;&gt;电脑访问&lt;/a&gt;</pre>
<div>
	其中中间用了列举法,列出常见手机的ua,还有一些常用的像op,ucweb,winwap一类的也要加上.<br />
	最后因为op有电脑版和手机版,所以如果用op没法进行选择.</div>
<div>
	Firefox:<br />
	接受:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br />
	用户代理:Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7</div>
<div>
	OP:<br />
	接受:text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1<br />
	用户代理:Opera/9.63 (Windows NT 5.2; U; Edition IBIS; zh-cn) Presto/2.1.1</div>
<div>
	IE7:<br />
	接受:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*<br />
	用户代理:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)</div>
<div>
	safari:<br />
	接受:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5<br />
	用户代理:Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN) AppleWebKit/525.28 (KHTML, like Gecko) Version/3.2.2 Safari/525.28.1</div>
<div>
	winwap:<br />
	接受:application/vnd.wap.wmlc, text/vnd.wap.wml, image/vnd.wap.wbmp, image/gif, image/jpeg, application/vnd.wap.wmlscriptc, text/vnd.wap.wmlscript<br />
	用户代理:WinWAP/3.2 (3.2.1.25; Win32)</div>
<div>
	nokia 7610:<br />
	接受:application/vnd.wap.wmlc, text/vnd.wap.wml, image/vnd.wap.wbmp, image/gif, image/jpeg, application/vnd.wap.wmlscriptc, text/vnd.wap.wmlscript<br />
	用户代理:为空什么也不输出</div>
<div>
	&nbsp;</div>
<div>
	<br />
	再来个php版的.</div>
<div>
	<pre class="brush:php;">
	&lt;?php 
$htm = &quot;/index.html&quot;;
$wap = &quot;/index.wml&quot;;
$wap2 = &quot;/index.htm&quot;;
$agent=$_SERVER[&#39;HTTP_USER_AGENT&#39;];
$Accept = $_SERVER[&quot;HTTP_ACCEPT&quot;];
echo $agent;
$isWAP = false;
     if (substr_count(strtolower($Accept),strtolower(&quot;wap&quot;)) ||  substr_count(strtolower($Accept),strtolower(&quot;wml&quot;))) {
      $isWAP = true;
     }else{
     $brow = substr($agent,0,4);
   if (strtolower($brow)==strtolower(&quot;Noki&quot;) || strtolower($brow)==strtolower(&quot;Eric&quot;) || strtolower($brow)==strtolower(&quot;R380&quot;) || strtolower($brow)==strtolower(&quot;MOT-&quot;) || strtolower($brow)==strtolower(&quot;UPG1&quot;) || strtolower($brow)==strtolower(&quot;Jing&quot;) || strtolower($brow)==strtolower(&quot;Acoo&quot;) || strtolower($brow)==strtolower(&quot;Wapt&quot;) || strtolower($brow)==strtolower(&quot;QWAP&quot;) || strtolower($brow)==strtolower(&quot;m-cr&quot;) || strtolower($brow)==strtolower(&quot;MC21&quot;) || strtolower($brow)==strtolower(&quot;Your&quot;) || strtolower($brow)==strtolower(&quot;YOUR&quot;) || strtolower($brow)==strtolower(&quot;w@pS&quot;) || strtolower($brow)==strtolower(&quot;Alca&quot;) || strtolower($brow)==strtolower(&quot;wapw&quot;) || strtolower($brow)==strtolower(&quot;Rain&quot;) || strtolower($brow)==strtolower(&quot;Java&quot;) || strtolower($brow)==strtolower(&quot;AUR &quot;) || strtolower($brow)==strtolower(&quot;UP.B&quot;) || strtolower($brow)==strtolower(&quot;WAPm&quot;) || strtolower($brow)==strtolower(&quot;WinW&quot;) || strtolower($brow)==strtolower(&quot;WapI&quot;) || strtolower($brow)==strtolower(&quot;WAPJ&quot;) || strtolower($brow)==strtolower(&quot;WapV&quot;) || strtolower($brow)==strtolower(&quot;4thp&quot;) || strtolower($brow)==strtolower(&quot;Waps&quot;) || strtolower($brow)==strtolower(&quot;Mits&quot;) || strtolower($brow)==strtolower(&quot;SIE-&quot;) || strtolower($brow)==strtolower(&quot;Aptu&quot;) || strtolower($brow)==strtolower(&quot;WmlS&quot;) || strtolower($brow)==strtolower(&quot;Wapa&quot;)) {
       $isWAP = true;
}}
       $isWAP2 = false;
     if ($isWAP) {
       if (substr_count(strtolower($Accept),strtolower(&quot;xhtml&quot;))) {
         $isWAP2 = true;
}}
   if ($isWAP2) {
    header(&quot;location:$wap2&quot;);}
   else if ($isWAP) {
     header(&quot;location:$wap&quot;);}
   else {
    header(&quot;location:$htm&quot;);
       }
?&gt;
&lt;p&gt;本页没有跳转,请手工选择您的线路&lt;/p&gt;
&lt;a href=&quot;http://wap.reynaldliu.net/index.wml&quot;&gt;低端手机wap&lt;/a&gt;&lt;a href=&quot;http://www.reynaldliu.net/index.htm&quot;&gt;高端手机xhtml&lt;/a&gt;&lt;a href=&quot;http://www.reynaldliu.net/index.html&quot;&gt;电脑访问&lt;/a&gt;</pre>
</div>
<div>
	&nbsp;</div>
<div>
	<br />
	这一个是网上搜的jsp版的,因为不会jsp也没有调试环境,不知道通不通得过,asp版和php都是我据这个修改得来.</div>
<div>
	<pre class="brush:java;">
	&lt;%
     String htm = &quot;/gas/index.html&quot;;
     String wap = &quot;/wap/index.wml&quot;;
     String wap2 = &quot;/wap2/index.xhtml&quot;;
     
     String agent = request.getHeader(&quot;user-agent&quot;);
     String accep = request.getHeader(&quot;accept&quot;);
     boolean isWAP = false;
     if (accep.toLowerCase().indexOf(&quot;vnd.wap.wml&quot;)&gt;0){
      isWAP = true;
     }else{
      String brow = agent.substring(0,4);
      if (
       brow.equals(&quot;Noki&quot;) ||
       brow.equals(&quot;Eric&quot;) ||
       brow.equals(&quot;R380&quot;) ||
       brow.equals(&quot;MOT-&quot;) ||
       brow.equals(&quot;UPG1&quot;) ||
       brow.equals(&quot;Jing&quot;) ||
       brow.equals(&quot;Acoo&quot;) ||
       brow.equals(&quot;Wapt&quot;) ||
       brow.equals(&quot;QWAP&quot;) ||
       brow.equals(&quot;m-cr&quot;) ||
       brow.equals(&quot;MC21&quot;) ||
       brow.equals(&quot;Your&quot;) ||
       brow.equals(&quot;YOUR&quot;) ||
       brow.equals(&quot;w@pS&quot;) ||
       brow.equals(&quot;Alca&quot;) ||
       brow.equals(&quot;wapw&quot;) ||
       brow.equals(&quot;Rain&quot;) ||
       brow.equals(&quot;Java&quot;) ||
       brow.equals(&quot;AUR &quot;) ||
       brow.equals(&quot;UP.B&quot;) ||
       brow.equals(&quot;WAPm&quot;) ||
       brow.equals(&quot;WinW&quot;) ||
       brow.equals(&quot;WapI&quot;) ||
       brow.equals(&quot;WAPJ&quot;) ||
       brow.equals(&quot;WapV&quot;) ||
       brow.equals(&quot;4thp&quot;) ||
       brow.equals(&quot;Waps&quot;) ||
       brow.equals(&quot;Mits&quot;) ||
       brow.equals(&quot;SIE-&quot;) ||
       brow.equals(&quot;Aptu&quot;) ||
       brow.equals(&quot;WmlS&quot;) ||
       brow.equals(&quot;Wapa&quot;)){
       isWAP = true;
      }
     }
     
     boolean isWAP2 = false;
     if (isWAP){
       if (accep.toLowerCase().indexOf(&quot;xhtml&quot;)&gt;0){
         isWAP2 = true;
       }
     }
   if (isWAP2){
    response.sendRedirect(wap2);
   }else if (isWAP){
    response.sendRedirect(wap);
   }else{
    response.sendRedirect(htm);
   }
%&gt;</pre>
</div>
]]></description>
			<link>http://www.reynaldliu.net/archives/8/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<category domain="http://www.reynaldliu.net/tag/wap%E7%BD%91%E7%AB%99/">wap网站</category>
			<category domain="http://www.reynaldliu.net/tag/wml%E7%BD%91%E7%AB%99/">wml网站</category>
			<category domain="http://www.reynaldliu.net/tag/xhtml+mobile/">xhtml mobile</category>
			<category domain="http://www.reynaldliu.net/tag/wap2.0/">wap2.0</category>
			<category domain="http://www.reynaldliu.net/tag/%E6%89%8B%E6%9C%BA%E7%BD%91%E7%AB%99/">手机网站</category>
			<pubDate>Wed, 02 Jun 2010 15:51:32 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/7/</link>
			<guid>http://www.reynaldliu.net/archives/7/</guid>
			<title>rsyncd3.07版（客户端）常用参数理解</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	<br />
	安静模式,不显示任何东西<br />
	-q</p>
<p>
	显示详细错误，用来查看日志状态。在计划任务时应该去掉，加快速度。在cmd窗口手工运行才打开排错。<br />
	<br />
	-v<br />
	对数据进行压缩传输<br />
	-z<br />
	递归模式，表示把文件夹和子文件夹一起传输<br />
	-r<br />
	指定传输端口，默认是873，服务端改过就要在这设置<br />
	--port<br />
	显示文件传送进程，百分比等信息,和-v一样，计划任务时应该去掉<br />
	--progress<br />
	延时删除<br />
	--delete-after<br />
	最大传输文件，大于这个值的文件不传输，一般是优先更新jpg,html这一类文件。大的如.mdb .flv .rar可以稍后更新<br />
	--max-size=2048K<br />
	最小输文件，结合上面的分两次传输.可以把大文件小文件分开传.但是注意设置值要交叉一点点。不然会造成正好是那个值的文件不能传送：）正好那个文件里面不是人。<br />
	--min-size=2048K<br />
	最大删除文件数，最好设一个。防止哪天弄错了。把整个盘删空了。<br />
	--max-delete=NUM<br />
	删除文件出错时，继续<br />
	--ignore-errors<br />
	只对文件大小检查，不检查时间<br />
	--size-only&nbsp;<br />
	忽略文件修改时间，和上面的意思相对，不可同时使用<br />
	--ignore-times<br />
	保留传输进程，就理解成断点续传吧<br />
	--partial<br />
	删除模式，就是在源删除的，那么更新到目标，让目标也删除，注意和remove-source-file区别，这个是表示在源传完后，删除源的。类似于剪切。<br />
	--delete<br />
	强制删除，当权限不足或IO错误时或文件不为空时，仍然强制删除<br />
	--force<br />
	强制完全备份传输，不管增量还是存在，一般用于目标上有文件，但是又需要完整备份一次.<br />
	--whole-file<br />
	--update 仅仅进行更新，也就是跳过所有已经存在于DST，并且文件时间晚于要备份的文件。(不覆盖更新的文件)<br />
	只更新已经存在的文件<br />
	--existing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip creating new files on receiver<br />
	跳过更新已经存在的文件<br />
	--ignore-existing&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip updating files that already exist on receiver<br />
	把更新文件放在最后执行<br />
	--delay-updates<br />
	不进行压缩的文件表达式，一般要跳过.mdb .gz .zip .rar .flv一类的大文件<br />
	--skip-compress=LIST&nbsp;&nbsp;&nbsp; skip compressing files with a suffix in LIST<br />
	设置压缩等级，应该取一个平衡值。压得越大，解压慢，但传输快。如果是在局域网或本机用，就不设了。<br />
	--compress-level=NUM&nbsp;&nbsp;&nbsp; explicitly set compression level<br />
	限制带宽，防止带宽被占用完，不终止同步再也没有办法进行远程连服务器了ssh,3389<br />
	--bwlimit=KBPS<br />
	这两个参数搭配生成更新文件列表，而不进行传输，可以用来做文件比较<br />
	--write-batch=FILE<br />
	--only-write-batch=FILE<br />
	--read-batch=FILE<br />
	中文有乱码时用这个开关<br />
	--iconv=CONVERT_SPEC</p>
]]></description>
			<link>http://www.reynaldliu.net/archives/7/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<pubDate>Wed, 02 Jun 2010 10:41:17 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/6/</link>
			<guid>http://www.reynaldliu.net/archives/6/</guid>
			<title>绿色版，全手工配置rsync,无须密码交互，不借助ssh</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	官网下载最新版的cwRscyn服务端和客户端，全都安装到c:\icw。复制icw目录一份。然后用自己带删除程序删除rscyn服务端和客户端。</p>
<p>
	全自动安装会有两问题。一是服务不会自动启动，二是在客户端不论如何都需要手工输入密码。因为在windows下没有所谓的chmod 600。而在linux下只需要把密码文件chmod 600改为只有所属人有权限即可。但是在windows下不行。即使你用了password-file=密码文件。还是一样。只需要改用windows下cmd批处理中标准的屏幕输语句和重定向输入即可完成。</p>
<p>
	关键处：echo rsc|C:\icw\bin\rsync -vzrtopg --ignore-errors&nbsp; --force --progress --delete&nbsp; rsc@192.168.1.174::freehost&nbsp; /cygdrive/d/freehost</p>
<p>
	格式如:</p>
<p>
	echo 密码|客户端命令行</p>
<p>
	而安装服务端则可以用下面的命令</p>
<p>
	&quot;C:\icw\bin\cygrunsrv&quot; -I g3szsouthRsync -c &quot;/cygdrive/c/icw&quot; -p &quot;/cygdrive/c/icw/bin/rsync.exe&quot; -a &quot;--config rsyncd.conf --daemon --no-detach&quot; -o -t auto -e &quot;CYGWIN=nontsec binmode&quot; -1 &quot;/cygdrive/c/icw/rsyncd-stdin.log&quot; -2 &quot;/cygdrive/c/icw/rsyncd-stderr.log&quot;&nbsp; -y &quot;tcpip&quot; -f &quot;g3szsouthRsync&quot;</p>
<p>
	下面来进行全手工配置。</p>
<p>
	先配置服务端conf文件</p>
<p>
	<br />
	use chroot = false<br />
	strict modes = false<br />
	hosts allow = *<br />
	log file = rsyncd.log<br />
	pid file = rsyncd.pid<br />
	secrets file = /cygdrive/c/icw/password<br />
	[freehost]<br />
	path = /cygdrive/d/freehost<br />
	read only = false<br />
	list = no<br />
	auth users = rsc<br />
	transfer logging = no</p>
<p>
	加入计划任务并且每天在18：40定时执行任务。这样做不会因为管理员密码修改而导致计划任务无效。如果是手工在图形界面下用控制面板添加的则和当前用户密码关联。一旦改密码就不会执行任务了。</p>
<p>
	at 18:40 /every:m,t,w,th,f,s,su C:\icw\手工开始同步.cmd</p>
<p>
	在c:\icw\下建一个password的文本文件。</p>
<p>
	以</p>
<p>
	用户名:密码</p>
<p>
	形式存放。一行一个。</p>
<p>
	然后启动服务即可运行了。上面的参数涉及到的对应的修改。</p>
<p>
	上面方法是针对WINDOWS2003到WINDOWS2003，也适用于LINUX到LINUX&nbsp;&nbsp;&nbsp;，LINUX到WINDOWS2003。</p>
<p>
	网上介绍的无需交互输入密码大多是LINUX下用password-file。和WIN下使用ssh-kengen。对两台服务器生成密钥互相设为信任认证。这样做的麻烦是程序不通用，每两台服务器都需要生成证书。</p>
<p>
	附一个已经打包好的绿色安装包。不可以修改解压路径。略做修改rscyn.conf和password即可运行了。</p>
<p>
	<a href="http://www.reynaldliu.net/attachment.php?id=3" title="g3bakservice.rar&#13;&#13;大小:5.55 M, 下载次数:12" target="_blank">g3bakservice.rar</a><br />
	&nbsp;</p>
<div>
	net start&nbsp; g3szsouthRsync</div>
]]></description>
			<link>http://www.reynaldliu.net/archives/6/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<category domain="http://www.reynaldliu.net/tag/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%8C%E6%AD%A5/">服务器同步</category>
			<category domain="http://www.reynaldliu.net/tag/%E5%AF%86%E7%A0%81/">密码</category>
			<category domain="http://www.reynaldliu.net/tag/%E4%B8%8D%E9%9C%80/">不需</category>
			<category domain="http://www.reynaldliu.net/tag/%E6%97%A0%E9%A1%BB/">无须</category>
			<category domain="http://www.reynaldliu.net/tag/%E6%97%A0%E9%9C%80/">无需</category>
			<category domain="http://www.reynaldliu.net/tag/cwrscyn/">cwrscyn</category>
			<category domain="http://www.reynaldliu.net/tag/rscyn/">rscyn</category>
			<pubDate>Fri, 28 May 2010 14:41:41 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/5/</link>
			<guid>http://www.reynaldliu.net/archives/5/</guid>
			<title>罗兰德制造无损迁移IIS(含匿名帐号,ntfs,acl,用户同步) For Win2003</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	windows下迁移网站确实不如linux下这么方便.<br />
	迁移一个两个那是好办.要是迁个虚拟主机.动不动五六百个呢?光是添加用户名密码,绑定域名,配置ntfs权限.每一项都能让人头大.何况要是再来个五六台服务器就三四千了.要是一个一个迁会要命的.<br />
	<br />
	不光是迁移.或者是因为服务器运行久了.慢了,中毒了.本文方法同样适用.要重装系统.<br />
	<br />
	下面这些方法都是尽量用身边最常用的软件,最能就地取材的方法.不借助于第三方,或偏门少见的软件实现.<br />
	<br />
	一.第一步首先搞到你所有用户名和密码.<br />
	<br />
	windows下的密码是搞不到的.存在sam文件中,并且是加密的.开机状态是不可以存取的.破密码的工具也有,可以用lrc,dump一类的工具进行爆破,但是现在我们不是要搞黑客.是自己的服务器.不用这么麻烦.何况就算要黑,跑一个用户的密码也是要跑很久的.<br />
	只需要一条命令开始运行打开cmd.exe<br />
	net &nbsp; user &nbsp; &gt; c:\userlist.txt<br />
	net &nbsp; user最多是三列的会像这样的格式<br />
	user1 &nbsp; &nbsp; &nbsp; user2 &nbsp; &nbsp; &nbsp; user3<br />
	得到一个所有用户的用户名列表.稍微整理一下,去掉超级管理员,guest等等非网站用户.弄成一列的形式.变成<br />
	user1<br />
	user2<br />
	user3<br />
	全选,把它贴到excel中.<br />
	这样在A1单元格填的就是user1,选中d1列输入一个数字,拖动填充柄往下拉.会自动自增帮你填好.拉到和用户名一样多就行.<br />
	然后在c1列点击fx,等号后输入函数,对d1列的数字进行任意一个tan,sin之类的正,余弦,正,余割都行.会生成一些随机小数位.同样拖动填充柄,往下拉,它会自动帮你填好相对单元格地址引用.<br />
	<br />
	然后,文件,另存为,保存时格式选 &nbsp; CSV(逗号分隔).csv存为userlist.csv<br />
	这个文件表现如下<br />
	user1,0.3365455<br />
	user2,0.5456464<br />
	user3,0.2123132<br />
	<br />
	目的就是为了构造<br />
	<br />
	用户名,密码<br />
	<br />
	中间以逗号分隔的列表便于后面调用.这个列表构造方法也很多.不一一例举.上面只是给出其中一种方法.<br />
	<br />
	如果有虚拟管理主机软件如prima,freehost,华众,蓝芒一类.更简单.直接数据库里面导出用户名密码列表即可.<br />
	<br />
	如星外,7i24可以在SQLserver查询分析器执行<br />
	select &nbsp; ftpname,ftppassword,serverlistid &nbsp; from &nbsp; FreeHost.FreeHost_Product_Host &nbsp; where &nbsp; serverlistid=1 &nbsp; or &nbsp; serverlistid=2 &nbsp; &nbsp; order &nbsp; by &nbsp; serverlistid<br />
	<br />
	serverlistid可以根据实际受控端来控制是否要一起导出.<br />
	在查询分析器右键,另存为即可得到一个userlist.csv的文件.<br />
	<br />
	<br />
	二.导出IIS配置备份<br />
	<br />
	del &nbsp; iismove.SC0<br />
	del &nbsp; iismove.MD0 &nbsp;<br />
	iisback.vbs &nbsp; &nbsp; /backup &nbsp; /b &nbsp; iismove &nbsp; &nbsp; /e &nbsp; iismove &nbsp; /overwrite &nbsp; /v &nbsp; 0<br />
	copy &nbsp; C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0 &nbsp; iismove.SC0<br />
	copy &nbsp; C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0 &nbsp; iismove.MD0<br />
	<br />
	以上是命令行的实现.图形化操作方法也附一个.<br />
	<br />
	iis管理器中最顶级处，右键，所有任务，配置备份、还原<br />
	<br />
	点创建备份，备份名称随便输入，勾选使用密码加密备份，一定要勾，不勾不能在别的电脑还原。<br />
	<br />
	<br />
	把C:\WINDOWS\system32\inetsrv\MetaBack中生成的MD0和SCO文件复制到新服务器中的<br />
	C:\WINDOWS\system32\inetsrv\MetaBack中。<br />
	<br />
	按上面的方法，恢复还原即可。<br />
	<br />
	<br />
	三.目标服务器IIS预配置<br />
	<br />
	复制前面生成的userlist.csv和批处理文件放同个目录<br />
	<br />
	md &nbsp; d:\freehost<br />
	for &nbsp; /f &nbsp; &quot;tokens=2* &nbsp; delims== &quot; &nbsp; %%b &nbsp; in &nbsp; ( &#39;wmic &nbsp; group &nbsp; where &nbsp; name^= &quot;IIS_WPG &quot; &nbsp; get &nbsp; SID &nbsp; /value^|findstr &nbsp; /i &nbsp; &quot;sid= &quot; &#39;) &nbsp; do &nbsp; (set &nbsp; WPG=%%b)<br />
	echo &nbsp; y|cacls.exe &nbsp; d:\freehost &nbsp; /c &nbsp; /s:D:(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)(A;OICI;FR;;;%WPG%)<br />
	net &nbsp; localgroup &nbsp; freehost &nbsp; /add<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; md &nbsp; d:\freehost\%%i\web<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; md &nbsp; d:\freehost\%%i\db<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; md &nbsp; d:\freehost\%%i\log<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; net &nbsp; user &nbsp; %%i &nbsp; %%j &nbsp; /add &nbsp; /expires:never &nbsp; /passwordchg:no &nbsp; /times:all<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; net &nbsp; localgroup &nbsp; freehost &nbsp; /add &nbsp; %%i<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; net &nbsp; localgroup &nbsp; users &nbsp; /delete &nbsp; %%i<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; setacl.bat &nbsp; %%i<br />
	<br />
	1.上面的命令会自动预建立d:\freehost为网站主目录.并只给iis_wpg组只读权限<br />
	(用于运行asp.net,php一类的程序.如果只运行asp.可以省去.)<br />
	2.增加freehost用户组,把userlist.csv中的用户建立并加入freehost组.这样做是便于管理.对freehost组进行组策略安全限制即可.<br />
	3.预建立用户文件星外的目录结构是<br />
	d:\freehost<br />
	d:\freehost\web<br />
	d:\freehost\log<br />
	d:\freehost\db<br />
	如果是其他的虚拟主机软件按照规则修改上面的路径即可.<br />
	prima是域名点号换下划线生成比如www.baidu.com的文件就是baidu_com<br />
	d:\baidu_com<br />
	d:\baidu_com\htdoc<br />
	d:\baidu_com\database<br />
	d:\baidu_com\weblog<br />
	文件名不一样,稍作改动即可.<br />
	<br />
	最后一行,是为各目录设置权限<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; setacl.bat &nbsp; %%i内容如下<br />
	<br />
	<br />
	for &nbsp; /f &nbsp; &quot;tokens=2* &nbsp; delims== &quot; &nbsp; %%a &nbsp; in &nbsp; ( &#39;wmic &nbsp; useraccount &nbsp; where &nbsp; name^= &quot;%1 &quot; &nbsp; get &nbsp; SID &nbsp; /value^|findstr &nbsp; /i &nbsp; &quot;sid= &quot; &#39;) &nbsp; do &nbsp; (set &nbsp; uSID=%%a)<br />
	for &nbsp; /f &nbsp; &quot;tokens=2* &nbsp; delims== &quot; &nbsp; %%b &nbsp; in &nbsp; ( &#39;wmic &nbsp; group &nbsp; where &nbsp; name^= &quot;IIS_WPG &quot; &nbsp; get &nbsp; SID &nbsp; /value^|findstr &nbsp; /i &nbsp; &quot;sid= &quot; &#39;) &nbsp; do &nbsp; (set &nbsp; uWPG=%%b)<br />
	echo &nbsp; y|cacls.exe &nbsp; d:\freehost\%1 &nbsp; /c &nbsp; /s:D:AI(A;;FR;;;%uSID%)(A;OICIIO;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)<br />
	echo &nbsp; y|cacls.exe &nbsp; d:\freehost\%1\db &nbsp; /c &nbsp; /t &nbsp; /s:D:AI(D;;SD;;;%uSID%)(A;;0x17019f;;;%uSID%)(A;OICIIO;SDWDGWGR;;;%uSID%)(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)<br />
	echo &nbsp; y|cacls.exe &nbsp; d:\freehost\%1\log &nbsp; /c &nbsp; /t &nbsp; /s:D:AI(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)<br />
	echo &nbsp; y|cacls.exe &nbsp; d:\freehost\%1\web &nbsp; /c &nbsp; /t &nbsp; /s:D:AI(D;;SD;;;%uSID%)(A;;0x17019f;;;%uSID%)(A;OICIIO;SDWDGWGR;;;%uSID%)(A;ID;FR;;;%uSID%)(A;OICIIOID;GR;;;%uSID%)(A;OICIID;FA;;;BA)(A;OICIID;FR;;;%uWPG%)(A;OICIID;FA;;;SY)<br />
	<br />
	<br />
	操作的内容是将外部变量用户名传入使用wmic管理命令查出用户名在本机的sid值.因为sid是唯一的(当然用黑客手段也可以让他不唯一,微软bug),即使是两台服务器上相同的用户名,或者在同一台服务器上建立一个用户名删除再建立相同名称的sid也不一样.所以不论重装系统后还是换过服务器都需要用上面批处理重设ntfs权限.<br />
	<br />
	使用的ntfs权限是ace,sddl格式.<br />
	因为权限项较多,说起来复杂就不一一说明.大约意思就是将各个用户主目录隔离开,对web目录允许脚本执行,log,db仅能html.防止webshell跨站.<br />
	<br />
	<br />
	首先到目标服务器上还原iis配置.自然目标服务器上的iis要安装好,如果原服务器有iisftp也需要把ftp安装好<br />
	<br />
	copy &nbsp; /y &nbsp; iismove.SC0 &nbsp; C:\WINDOWS\system32\inetsrv\MetaBack\iismove.SC0 &nbsp;<br />
	copy &nbsp; /y &nbsp; iismove.MD0 &nbsp; C:\WINDOWS\system32\inetsrv\MetaBack\iismove.MD0<br />
	del &nbsp; iismove.SC0<br />
	del &nbsp; iismove.MD0 &nbsp;<br />
	iisback.vbs &nbsp; &nbsp; /restore &nbsp; /b &nbsp; iismove &nbsp; &nbsp; /e &nbsp; iismove &nbsp; &nbsp; /v &nbsp; 0<br />
	进行IIS还原.<br />
	<br />
	注意事项:如果有asp.net,isapi_rewrite重写组件,华盾等基于iisfilter的组件,也须要先安装上.不然会因为找不到这些过滤器,会在事件管理器找到大量的错误iis始终是server &nbsp; unavailable.<br />
	<br />
	做到这里,目标IIS差不多已经恢复了,打开html已经正常.<br />
	但是运行asp &nbsp; asp.net &nbsp; 一类的程序会被告知401 &nbsp; acl拒绝.因为iis里面的密码没有被同步.<br />
	<br />
	四.最后来做iis匿名访问密码同步.<br />
	<br />
	<br />
	先导出iis中站点的节点ID编号对照表.<br />
	<br />
	更新W3ID批量表.bat<br />
	<br />
	del &nbsp; &nbsp; c:\sitelisttemp.txt<br />
	iisweb/query&gt; c:\sitelisttemp.txt<br />
	<br />
	<br />
	rem &nbsp; 更新W3ID批量表.bat<br />
	for &nbsp; /f &nbsp; &quot;delims=, &nbsp; tokens=1,2 &quot; &nbsp; %%i &nbsp; in &nbsp; (userlist.CSV) &nbsp; do &nbsp; chageuserpass.bat &nbsp; %%i &nbsp; %%j<br />
	<br />
	<br />
	chageuserpass.bat<br />
	<br />
	net &nbsp; user &nbsp; %1 &nbsp; %2<br />
	type &nbsp; c:\sitelisttemp.txt|grep &nbsp; &quot;^%1. &quot;|cut &nbsp; -d &quot;( &quot; &nbsp; -f2|cut &nbsp; -d &quot;) &quot; &nbsp; -f1&gt; c:\W3IDtemp.txt<br />
	set &nbsp; /p &nbsp; W3ID= &lt;c:\W3IDtemp.txt<br />
	adsutil.vbs &nbsp; set &nbsp; %W3ID%/AnonymousUserName &nbsp; %1<br />
	adsutil.vbs &nbsp; set &nbsp; %W3ID%/AnonymousUserPass &nbsp; %2<br />
	<br />
	因为windows下批处理处理字符的功能太弱要嵌套太多for命令.怕大家看得头晕.这里借用了linux两个命令.<br />
	grep和cut.去网上找到http://unxutils.sourceforge.net/UnxUtils.zip解压把里面这两个文件复制c:\windows\system32中即可.<br />
	假如你实在找不到这两个文件.用windows下for批处理也是可以的.只是略嫌麻烦.<br />
	<br />
	<br />
	开始运行iisreset &nbsp; /timout:0<br />
	对iis进行重启,然后开始<br />
	大功告成了.<br />
	<a href="http://www.reynaldliu.net">http://www.reynaldliu.net</a></p>
]]></description>
			<link>http://www.reynaldliu.net/archives/5/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<pubDate>Thu, 22 Apr 2010 11:57:47 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/4/</link>
			<guid>http://www.reynaldliu.net/archives/4/</guid>
			<title>在linux下运行asp For apache2.2.x版本修改源文件模块，编译通过</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	翻遍互联网，只有iasp2.11版本是最新版本，官网打不开了。估计倒闭了。这个版本最后日期是2006。</p>
<p>
	而当时的apache最高版本是2.0.x</p>
<p>
	如果现在再去用的话，多数的apache是2.2.x以上的版本。而2.0和2.2是两个不同的开发分支有很多不同。2.0里面的mod和apr API多数不一样。</p>
<p>
	经历数个小时，翻apache api手册，一一新旧api函数对着改成2.2版本。</p>
<p>
	在动手改之前，网上翻了，所有碰到的问题和回答大都类似。</p>
<p>
	都是：要么降回1.3版，这是当时支持得最好的版本。可以直接安装，也不需要重新编译。</p>
<p>
	如果是用2.0版本的，则要求自行编译，按网上的文章如果是用apache2.0可以通得过。但是现在大多apache都已经用2.2x以上版本了。用网上的自行编译的方法通过了。在启动apache的时候会报</p>
<p>
	undefined symbol: ap_http_method</p>
<p>
	翻2.2的API手册，得知这个是1.3中的api，在新版中改成ap_http_scema了</p>
<p>
	再重新编译，启动apache,接着又报undefined symbol:ap_palloc</p>
<p>
	同样的翻手册对着改函数名。前后一共约16个函数名。分别修改mod_iasp.c和utils.c</p>
<p>
	改完再编译，启动apache2.2.14通过了。</p>
<p>
	只是还是不支持mdb。在iasp的管理台后台可以启用ado,access。</p>
<p>
	但是中文问题目前还不知道怎么解决。中文全变黑方块了。估计是jsp到apache的代理通道转换不对。回头再看看。</p>
<p>
	附上修改好的 在apache2.2.14,jdk1.6,apr1.3.9,centos5.3下编译通过的源文件包。下载这个包复盖回/iasp/bin/apache/source/2.0中</p>
<p>
	再按网上的方法编译即可。</p>
<p>
	<a href="http://www.reynaldliu.net/attachment.php?id=2" title="2.0.rar&#13;&#13;大小:11.2 K, 下载次数:22" target="_blank">2.0.rar</a></p>
]]></description>
			<link>http://www.reynaldliu.net/archives/4/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<pubDate>Tue, 20 Apr 2010 19:57:38 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/3/</link>
			<guid>http://www.reynaldliu.net/archives/3/</guid>
			<title>查看apache编译参数的各种方法</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	查看apache编译参数的各种方法。</p>
<div>
	<br />
	一。<br />
	httpd -l<br />
	列出编译的模块文件。一般可以在/usr/local/apache2/include/文件夹下找到这里列出的文件。</div>
<div>
	二。<br />
	httpd -V<br />
	这里可以看出大部分关于apache的版本信息，安装操作系统位数平台及apr版本。</div>
<div>
	三。<br />
	httpd -M<br />
	列出编译过的模块。同时能看到哪些模块是static静态编译，哪一些是shared动态加载的。</div>
<div>
	四。<br />
	config.nice<br />
	这个文件一般在prefix所指目录例/usr/local/apache2/build/config.nice文件。用vi打开看，复制出来可以直贴到shell窗口进行configure。</div>
<div>
	如果已经static编译过的模块，再次修改httpd.conf方式用loadmodule命令，在启动apache时会报<br />
	&quot;模块名&quot; is built-in and can&#39;t be loaded.<br />
	的错误。</div>
]]></description>
			<link>http://www.reynaldliu.net/archives/3/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<pubDate>Mon, 12 Apr 2010 14:19:41 +0000</pubDate>
		</item>
		<item>
			<link>http://www.reynaldliu.net/archives/1/</link>
			<guid>http://www.reynaldliu.net/archives/1/</guid>
			<title>windows下手动编译php,改变默认php.ini路径</title>
			<author>39338055@qq.com(reynaldliu)</author>
			<description><![CDATA[Reynald Liu-je m' appelle rènaldliu ( http://www.reynaldliu.net/ ) : <p>
	手工编译改变php.ini路径<br />
	有什么用呢？比如说：<br />
	你可以增加php扩展功能<br />
	你可以修改php.ini的默认位置不放到c:\windows\php.ini下面。<br />
	<font color="#ff0000"><font face="新宋体 "><br />
	<br />
	方法一：修改路径，编译时加参数</font><font face="Verdana ">--with-config-file-scan-dir=c:\aaa</font></font><br />
	<font color="red">cscript /nologo configure.js --enable-snapshot-build --with-config-file-scan-dir=c:\aaa</font><br />
	<br />
	<font color="red">方法二：修改php.ini文件名</font><br />
	<font color="red">main\config.w32.h查找所有php.ini改名为所要文件名，记住。并同时修改\main\php_ini.c下面这行的php.ini为前面一样的文件名。两个文件两处需要同时对应一样的改。</font><br />
	<font color="red">fh.handle.fp = php_fopen_with_path(&quot;php.ini&quot;, &quot;r&quot;, php_ini_search_path, &amp;php_ini_opened_path TSRMLS_CC);</font><br />
	<br />
	<br />
	<font face="NSimsun "><font color="red">编译。OK</font><br />
	</font><br />
	<br />
	<br />
	开始之前，如果你装了vs2005,vs2003 vs2008一类的工具，他们的变量会抢占cl.exe变量。这些冲突你要自行解决，大部分属于环境变量问题。<br />
	要么先删除这些编译工具，要么重装系统，给他一个干净的vc6++安装环境。<br />
	1.下载需要的文件<br />
	1.下载vc6++ sp6,约184M的rar包，解开来是iso<br />
	2.下载2003 platform sdk,分卷cab包,约13个。每个25M，共约384M<br />
	3.<a href="http://www.php.net/extra/win32build.zip" target="_blank">http://www.php.net/extra/win32build.zip</a>包，必须的<br />
	4.<a href="http://www.php.net/extra/bindlib_w32.zip" target="_blank">http://www.php.net/extra/bindlib_w32.zip</a>，必须的<br />
	5.<a href="http://pecl2.php.net/downloads/php-windows-builds/php-libs/binary-tools.zip" target="_blank">http://pecl2.php.net/downloads/p ... bs/binary-tools.zip</a>,必须的<br />
	6.<a href="http://files.edin.dk/php/win32/zip.zip" target="_blank">http://files.edin.dk/php/win32/zip.zip</a>，所有支持包，下载了这个，不用下载libxml包<br />
	7.需要的编译的php源代码。是源代码，不是安装包。就是linux下面用的那些。<br />
	<a href="http://www.php.net/releases/" target="_blank">http://www.php.net/releases/</a><br />
	页面中以tar.bz2结尾，tar.gz的那些就是。请只下载5.x开头的版本。<br />
	<br />
	2、环境要求<br />
	基于Windows NT的windows，w9x就别闹了。<br />
	Visual Stdio C++ 6<br />
	Winxp,win2003(需要下载不同版本的platform sdk)<br />
	<br />
	3、建立目录<br />
	1.c:\work<br />
	2.c:\work\win32build(win32build.zip解压)<br />
	3.c:\work\bindlib_w32(bindlib_w32.zip解压)<br />
	4.binary-tools.zip解压后放入win32build下的bin目录。<br />
	5.<a href="http://files.edin.dk/php/win32/zip.zip" target="_blank">http://files.edin.dk/php/win32/zip.zip</a>解压放到win32build目录下面<br />
	6.右键，我的电脑属性，高级，环境变量，在下面&ldquo;系统变量&rdquo;里面找到PATH双击，在最后面加上;c:\work\win32build\bin<br />
	前面的分号不要少了。<br />
	7.解压php源代码到c:\work\php-5.x<br />
	<br />
	4、打开cmd窗口，转到 c:\work\php源代码目录<br />
	输入buildconf得到configure.js文件<br />
	cscript /nologo configure.js --enable-snapshot-build<br />
	如果你没有下载<a href="http://files.edin.dk/php/win32/zip.zip" target="_blank">http://files.edin.dk/php/win32/zip.zip</a>这里的文件放进去，就不能用这个命令，不然会产生大量的编译错误。<br />
	帮助命令，懂英文的自己看。编译过linux下的php一看就明白。<br />
	cscript /nologo configure.js --help<br />
	<br />
	5、开始编译<br />
	输入nmake snap<br />
	一般是报什么什么.h文件not found或找不到就是没有下载zip.zip文件包，或没有放对地方。<br />
	如果是编译cl.exe错误，就是环境变量设置不对或cl.exe冲突了。你安装了很多个编译器比如vs2003 vs2005什么的。<br />
	vc6的编译器是<br />
	Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8<br />
	Copyright (C) Microsoft Corp 1984-1998. All rights reserved.<br />
	如果你在cmd下输入cl回车，报命令找不到，或显示不是上面的。环境就配置不对。自行搞定去吧。几句话也说不清楚。<br />
	edit by reynaldliu 2009.09.10<br />
	&nbsp;</p>
<p>
	---------------需要编译的原由---------------------------------------------------------------------------------------------</p>
<p>
	因为<span class="t_tag" href="tag.php?name=windows" onclick="tagshow(event)">windows</span>下,iis默认的php.ini是<span class="t_tag" href="tag.php?name=%CB%D1%CB%F7" onclick="tagshow(event)">搜索</span>c:\windows\php.ini<br />
	<br />
	现在需要多版本共存,所以希望可以把php.ini改名成为php2.ini,php3.ini,php4.ini这样的或能改变路径不是c:\windows也行.<br />
	<br />
	现希望实现以上功能.只能寄望于自行编译php了.<br />
	环境如下:<br />
	php5.0(及以上版本)<br />
	win2003+iis6,isapi模式<br />
	vs2005编译器<br />
	<br />
	需要修改php5<span class="t_tag" href="tag.php?name=%D4%B4%C2%EB" onclick="tagshow(event)">源码</span>包的哪些<span class="t_tag" href="tag.php?name=%CE%C4%BC%FE" onclick="tagshow(event)">文件</span>..........有耐心的朋友给个方法.没耐心的<span class="t_tag" href="tag.php?name=%B8%DF%CA%D6" onclick="tagshow(event)">高手</span>稍点一下也可以.<br />
	<br />
	试过phprc,这个变量是所有php5共用的.不能区分开各版本用的php.ini<br />
	<br />
	<span class="t_tag" href="tag.php?name=apache" onclick="tagshow(event)">apache</span>的多版本共存,我会弄,只要指定不同的phpinidir就行了.但是这里不能采用.并且不是php4,php5这样的共存.举个例子php5.2.9和php5.2.10这样的共存.<br />
	<br />
	已经搞过在注册表里面inifilepath:5.2.9这样建多个键值.就像zend的文件夹那样为每一个版本建一个注册表键值.<br />
	<font face="NSimsun ">HKEY_LOCAL_MACHINE\SOFTWARE\<span class="t_tag" href="tag.php?name=PHP" onclick="tagshow(event)">PHP</span>\5\IniFilePath -&gt; c:\php5</font><br />
	<font face="NSimsun ">HKEY_LOCAL_MACHINE\SOFTWARE\PHP\5\2\IniFilePath -&gt; c:\php5.2</font><br />
	<font face="NSimsun ">HKEY_LOCAL_MACHINE\SOFTWARE\PHP\5\2\9\IniFilePath -&gt; c:\php5.2.9</font><br />
	<font face="NSimsun ">HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath -&gt; c:\php4<br />
	</font><br />
	<font face="NSimsun ">这种方法<span class="t_tag" href="tag.php?name=%BD%E2%BE%F6" onclick="tagshow(event)">解决</span>不了他加载<span class="t_tag" href="tag.php?name=mysql" onclick="tagshow(event)">mysql</span>扩展这些问题.因为没有phprc,等的支持,没有<span class="t_tag" href="tag.php?name=%B0%EC%B7%A8" onclick="tagshow(event)">办法</span>区分开来libmysql.dll与之对应的php版本. 比如php5.1和php5.3所用的libmysql.dll可能就不同.</font><br />
	<br />
	<br />
	<font face="NSimsun "><font color="red">已经解决，方法已经找到。</font></font><br />
	<br />
	<font color="red"><font face="新宋体 ">方法一：修改路径，编译时加参数</font><font face="Verdana ">--with-config-file-scan-dir=c:\aaa</font></font><br />
	<font color="red">cscript /nologo configure.js --enable-snapshot-build --with-config-file-scan-dir=c:\aaa</font><br />
	<br />
	<font color="red">方法二：修改php.ini文件名</font><br />
	<font color="red">main\config.w32.h查找所有php.ini改名为所要文件名，记住。并同时修改\main\php_ini.c下面这行的php.ini为前面一样的文件名。两个文件两处需要同时对应一样的改。</font><br />
	<font color="red">fh.handle.fp = php_fopen_with_path(&quot;php.ini&quot;, &quot;r&quot;, php_ini_search_path, &amp;php_ini_opened_path TSRMLS_CC);</font><br />
	<br />
	<br />
	<font face="NSimsun "><font color="red">编译。OK</font><br />
	</font></p>
]]></description>
			<link>http://www.reynaldliu.net/archives/1/</link>
			<category domain="http://www.reynaldliu.net/category/skill/">技术相关</category>
			<pubDate>Thu, 28 Jan 2010 14:49:55 +0000</pubDate>
		</item>
	</channel>
</rss>
