http://blog.csdn.net/keke0307/article/details/7023551



本文引用自-Club·King《isapi_rewrite3.1完整中文手册》

可以用于iis中的wordpress,wp的url重写。并且是完整功能的。没有45天限制。lite版则不能用代理,location,等功能。


先安装官方文件再用复盖补丁文件夹下所有文件替换。替换时提示拒绝访问则需要先停止iisadmin。


开始,运行


net stop /y iisadmin


再进行复盖。如果复盖时还提示拒绝访问也可以全选把原来安装文件夹的文件删除再复制复盖复盖完成后【ISAPI_RewriteSnapin.dll我就是删除在粘贴破解文件的】。


net start iisadmin


net start w3svc


net start ftpsvc


即完成了破解。虽然还是会提示使用期限到了或过期并且过期时间是负数但是不会像没有破解前一样弹出一个确定框禁止访问。


另外破解后需要手工编辑httpd. conf。因为编辑按钮是灰色的不能按了。但是不影响功能使用。


第一章软件介绍

ISAPI_Rewrite 是一款适用于IIS的功能强大的基于正则表达式的URL处理模块。它兼容Apache的mod_rewrite的语法从而使仅仅复制.htaccess文件就把配置从appach移植到IIS中或者从IIS移值到appach中变成可能。请参阅3.2兼容性图表这一节。

ISAPI_Rewrite最重要的功能

ISAPI_Rewrite提供了和Apach mod_rewrite相同的句法和行为使仅仅拷贝.htaccess文件就完成配置移植成为功能。(要想阅读更多关于与mod_rewrite的兼容性请参阅3.2兼容性图表这一节。)

正则表达式支持灵活而强大的配置。

极速而且容易升级的纯C++代码。

真正的分布式配置实时监控服务器全局级别、虚拟主机网站级别、目录级别的.htaccess文件。

隔离性用户级配置只影响本地用户环境从而使ISAPI_Rewrite成为Web主机提供商的理想解决方案。

重要的应用示例

搜索引擎优化。

一台Web服务器的代理内容经过另一台web服务器。

防止内容被吸血盗链。

阻断特定主机、反向链接或者烦人的搜索机器人。

内容商议向不同的语言用户或者不同的浏览器用户提供不同的文件。示例

为群集式服务器架构模拟负载均衡。

定价资料

45天的试用期

单机版99美元

ISAPI_Rewrite精简版是免费的。在这里可以看到受限的细节说明。

大宗采购可议折扣。


2.1系统要求

ISAPI_Rewrite可以被安装在下列操作系统中

Windows 2000 with IIS 5

Windows XP with IIS 5.1

Windows Server 2003 with IIS 6.0

Windows Vista with IIS 7.0

Windows Server 2008 with IIS 7.0

在安装ISAPI_Rewrite之前操作系统中必须先安装IIS。

32位和64位的Windows版本都是支持的但是你必须下载32位版和64位版两种不同的安装包。Windows Installer 2.0必须运行安装程序。你可以从微软的网站上下载到最新版本的Windows Installer。

在Windows Vista和Windows Server 2008上安装ISAPI_Rewrite还必须先安装下面两个模块(默认情况下这两个模块是不安装的)

ISAPI过滤器

ISAPI 扩展


2.2安装程序

在运行安装包之前请先阅读系统要求部分。下载并安装某个版本的ISAPI_Rewrite.msi依照安装向导的说明操作。安装过程是自动的并有自我描述。ISAPI_Rewrite在自动安装过程中必须重启IIS。下列服务必须被重启IISADMIN、W3SVC。不需要手工把任何ISAPI筛选器或者扩展加入到网站或者全局列表中。它能够在安装和配置过程中自动完成。

命令行安装

ISAPI_Rewrite也能够通过命令行进行后台安装。请使用以下命令行语法来安装


msiexec /i ISAPI_Rewrite3.msi /qn AcceptEULA=Yes REGISTRATIONCODE=Code   REGISTRATIONNAME=Name  用命令行来后台反安装ISAPI_Rewrite请使用下面的语法


msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes2.3手工安装

要手工安装ISAPI_Rewrite的话你必须下载不同的手工安装包包含所有必须的文件。ISAPI_Rewrite精简版不支持手工安装。你可以安装全部功能或者仅仅安装它们中的一部分。

手工安装包包含下列文件

ISAPI_Rewrite.dll - 这是ISAPI筛选器本身。

ISAPI_RewriteProxy.dll - 这是为代理操作的ISAPI扩展模块必不可少的。

license.rtf - EULA的产品许可证。

ISAPI_Rewrite.chm - .文档文件。

httpd.conf - 全局配置文件示例。

安装ISAPI_Rewrite首先你必须在你在IIS系统中注册ISAPI_Rewrite.dll作为ISAPI筛选器。按默认ISAPI_Rewrite.dll文件是用来作为全局ISAPI筛选器的。而且它还能够被安装到某个特定的网站里你需要记住在同一时间段里只有一个ISAPI_Rewrite.dll实例能够加载到一个IIS工作进程里这意味着如果你决定把ISAPI_Rewrite的ISAPI筛选器单独地安装到每个站点里的话你必须把这些站点切换高隔离模式从而为这些网站产生独立的工作进程。如果你需要在每个站点上分别安装ISAPI_Rewrite我们通常会建议改为在整个IIS上全局地安装它。

在Window 2000,Window XP 和Windows Server 2003中注册ISAPI 筛选器无论是整个IIS服务器要用它还是个别WEB网站要用它都要用IIS 的MMC管理单元来把ISAPI_Rewrite.dll添到ISAPI筛选器列表。在Windows Vista和Windows Server 2008中首先你需要安装可选IIS组件万维网服务、应用程序开发功能、ISAPI筛选器。

如果你需要代理服务器功能你还需要将ISAPI_RewriteProxy.dll注册为ISAPI扩展来侍服文件扩展名“*. rwhlp”。在不同的IIS版本中要求不同的操作。请参阅你管理的IIS版本的文档来了解如何注册一个新的ISAPI扩展并把它映射到IIS系统的文件扩展名上。在Windows Vista和windows server 2008首先必须安装可选的IIS组件万组网服务、应用程序开发功能、ISAPI筛选器。使用短路径名8.3模式作为ISAPI_RewriteProxy.dll的模块路径如果路径里有一个空格字符IIS载入这个模块时将失败。

把httpd.conf文件放在ISAPI_Rewrite.dll文件的同一目录下并编辑它。

把下列两行内容放到httpd.conf文件中以注册ISAPI_Rewrite 产品


RegistrationName=Your registration name  RegistrationCode=REG-CODE-PROVIDED-FROM-HELICON依照“运行ISAPI_Rewrite的权限需求”这一部分的说明来检查文件系统权限。


2.4反安装

反安装程序会删除所有安装程序所生成的文件、从管理元库中注销筛选器并删除所有由安装程序所添加的其它管理元库变化。如果用户决定在反安装过程中保留用户文件的话下列用户数据文件在反安装后会被留下来。


文件名 说明 

Program Files/Helicon/ISAPI_Rewrite/httpd.conf 用户规则的主配置文件 

Program Files/Helicon/ISAPI_Rewrite/error.log 包含错误日志的文件 

Program Files/Helicon/ISAPI_Rewrite/rewrite.log 包含重写日志的文件 

.htaccess (various folders) 用户创建的含有规则的配置文件


“删除用户创建的文件”的选项在将反安装过程中提供给用户。如果启用这个选项则卸载程序也将删除位于Program Files文件夹里用户创建的文件。 .htaccess文件不会被删除。

要用命令行后台卸载ISAPI_Rewrite请使用下面的语法


msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes


 


2.5运行ISAPI_Rewrite所需的权限

在一个干净的默认Windows系统上自动安装ISAPI_Rewrite不要求任何权限调整。但是一些其它产品比如说Plesk、IIS锁定工具的安装等等可能收紧服务器的安全性并妨碍ISAPI_Rewrite的正常运行。下面是ISAPI_Rewrite的权限需求的列表单子

在Windows 2000、Windows XP和Windows 2003的IIS5兼容模式下筛选器运行在System帐户下的inetinfo.exe进程中。那个system帐户至少得被授予放置ISAPI_Rewrite安装文件的那个文件夹的“读取”和“目录浏览”的权限。我们还建议给予system帐号对这个文件夹的一般修改权。这将允许生成一些包含解析或者其它错误的文件。system帐号还必须在任何包含了.htaccess文件的网站文件夹里同样被授予这些权限否则ISAPI_Rewrite将不能加载并监视它。

请稍留意ISAPI_Rewrite安装目录上的任何一点拒绝权限设置因为在Windows 操作系统中拒绝权限优先于任何允许权限记录。

在Windows 2003的天然IIS模式(WPI模式)以及Windows Server 2008中无论是筛选器还是代理服务都运行在每个网站相应的运行程序池的w3p.exe工作进程中每个应用程序池都可以使用它自己的定制来配置这可能使权限设置成了一种复杂的工作。然而在一个正确的IIS配置中每个使用中的定制必须是IIS_WPG组的一个成员。因此IIS_WPG组可以被用来代替System帐号去分配前面所写的权限需求。

在Windows Vista 中权限配置是和Windows 2003的配置差不多的只是它没有IIW_WPG组。所以所有的WPI帐号一般Network Service是它的惟一帐号都必须授予上述必需权限。

此外为了让代理服务功能能工作你必须在网站属性或者运行代理服务的web应用程序的属性中给予一个“纯脚本”的执行权限。


2.6MSI的自定义行为自定义行为



自定义行为 说明 

WiseAltStartup

自动智能启动 为运行在延时模式中的自定义行为保存属性的当前状态。

使用一个可执行文件(dll)

发生在安装、反安装。 

WiseCleanup

智能清理 这个行为被调用来清理上一个自定义行为所遗留下的临时文件

使用一个可执行文件(dll)

发生在安装、反安装。 

WiseStartup

智能启动 这个行为使调用一个.dll文件或者提取必要Wisescript.exe文件和.dll文件的行为可以传递参数。

使用一个可执行文件(dll)

发生在: 安装、反安装 

WiseUpgradeCheck

智能可选择地升级 这个行为被调用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。

使用一个可执行文件(dll)

发生在安装。 

WiseUpgradeCheckEx

智能预选升级 添加这个行为用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。

使用一个可执行文件(dll)

发生在安装。 

WiseGetIISVersion

智能获得IIS版本 对主要的IIS版本设置属性(IISVERSION).

使用一个可执行文件(dll)

发生在安装。 

RegisterFilterInMetabase

在管理元库中注册筛选器 这个行为添加一个命名为ISAPI_Rewrite3的全局ISAPI筛选器到IIS管理元库里

IIS5, IIS6 管理元库: IIS:/LM/W3SVC/Filters/ add key ISAPI_Rewrite3

IIS:/LM/W3SVC/Filters/FilterLoadOrder append "ISAPI_Rewrite3"

使用一个可执行文件(dll)

发生在安装。 

RemoveFilterFromMetabase

从管理元库中删除筛选器 这个行为从IIS管理元库里移除了名为ISAPI_Rewrite3的全局ISAPI筛选器。

IIS5, IIS6 管理元库: IIS://localhost/W3SVC/LM/W3SVC/Filters/ delete key ISAPI_Rewrite3

IIS:/LM/W3SVC/Filters/FilterLoadOrder remove"ISAPI_Rewrite3"

使用一个可执行文件(dll)

发生在反安装、回滚。 

AddApplicationExtension

添加应用程序扩展 只用于Windows 2003机器添加ISAPI_RewriteProxy.dll到ISAPI扩展中并使Web服务器扩展名列表中的这个ISAPI扩展名可用。

IIS6管理元库: IIS:/LM/W3SVC/

adds entry to the在管理元库属性 WebSvcExtRestrictionList中增加metabase property "ISAPI_Rewrite3 proxy"条目

在管理元库属性 ApplicationDependencies 增加"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"条目

使用一个可执行文件(dll)

发生在安装。 

RemoveApplicationExtension

删除应用程序扩展 只用于Windows 2003从ISAPI扩展中删除ISAPI_RewriteProxy.dll并从web服务器扩展名列表中删除这个ISAPI扩展名。

IIS6管理元库: IIS:/LM/W3SVC/

1.从管理元库属性 WebSvcExtRestrictionList 中删除"ISAPI_Rewrite3 proxy"条目

2.从管理元库属性 ApplicationDependencies中删除"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"条目

使用一个可执行文件(dll)

发生在反安装、回滚。 

RegisterExtensionInScriptMap

在脚本映射中注册扩展 在IIS管理员库中将ISAPI_RewriteProxy.dl注册为ISAPI扩展来处理*.rwhlp文件扩展名

IIS5,IIS6管理元库: IIS://LM/W3SVC/

使用一个可执行文件(dll)

发生在安装。 

RemoveExtensionFromScriptMap

从脚本映射中删除扩展 从IIS管理元库中移除作为ISAPI扩展、用于处理*.rwhlp文件扩展名的ISAPI_Rewrite.dll的注册信息

IIS5, IIS6管理元库: IIS://LM/W3SVC/

使用一个可执行文件(dll)

发生在反安装、回滚。 

GetServisesStatus

获得服务状态 保存IISADMIN、W2WC、NNTP、SMTP 和FTP 服务的当前状态

创建msi属性: [SERVICES_STATUS]

使用一个可执行文件(dll)

发生在: 安装、反安装。 

StartServicesEx

按预设开启服务 根据状态预设来启动ISADMIN、W2WC、NNTP、 SMTP 和 FTP 服务

使用msi 属性: [SERVICES_STATUS]

使用一个可执行文件(dll)

发生在: 安装、反安装。 

SaveProd tID

保存产品ID 如果要注册产品的话保存REGISTRATIONNAME和REGISTRATIONCODE的属性值

使用msi 属性: [REGISTRATIONNAME] , [REGISTRATIONCODE];

使用文件: [INSTALLDIR]\ISAPI_Rewrite3\httpd.conf

使用一个可执行文件(dll)

发生在: 安装。 

Check32bitMode

检测32位模式 在64位系统中检查32位IIS兼容模式是否可用从而安装正确的ISAPI筛选器版本。IIS6, IIS7

使用管理元库路径: IIS://LM/W3SVC/AppPools property Enable32bitAppOnWin64;

使用msi 属性:[ENABLE32BITAPPONWIN64]

检查一个32位的应用程序是否能运行在一台安装了64位版本的windows的电脑上。

使用javascript脚本

发生在: 安装。 

CheckIISModules

检测IIS模块 在IIS7的机器上检查是否需要安装IsapiFilterModule和IsapiModule模块

IIS7 管理元库路径

使用javascript脚本

发生在: 安装。 

AddGlobalIsapiFilter

添加全局ISAPI筛选器 只用于IIS7的机器。这个行为会在IIS管理元库里添加一个命名为ISAPI_Rewrite3的全局ISAPI_Rewrite筛选器

IIS7的管理元库路径

使用JavaScript脚本

发生在安装。 

DeleteGlobalIsapiFilter

删除全局ISAPI过滤器 只用于IIS7的机器这个行为会从IIS管理元库中删除名为ISAPI_Rewrite3的全局ISAPI筛选器。

IIS7的管理元库路径

使用JavaScript脚本

发生在反安装、回滚。 

AddIsapiCgiRestriction

添加ISAPI CGI约束 Only for IIS7 machines register ISAPI_RewriteProxy.dll as ISAPI extension in IIS metabase.

只用于IIS7的机器在IIS管理元库中将ISAPI_RewriteProxy.dl为ISAPI扩展

IIS7管理元库路径

使用JavaScript脚本

发生在安装。 

DeleteIsapiCgiRestriction

删除ISAPI CGI约束 只用于IIS7的机器从IIS管理元库中删除用作ISAPI扩展的ISAPI_RewriteProxy.dll。

IIS7 管理元库路径

使用JavaScript脚本

发生在反安装、回滚。 

AddScriptMap

添加脚本映射 只用于IIS7的机器在IIS管理元库中将ISAPI_RewriteProxy.dll注册为ISAPI扩展用于处理*.rwhlp文件扩展名。

IIS7管理元库路径

使用JavaScript脚本

发生在安装。 

DeleteScriptMap

删除脚本映射 只用于IIS7的机器从IIS管理元库里去除用作ISAPI扩展以处理*.rwhlp文件扩展名的ISAPI_RewriteProxy.dll的注册

IIS7管理元库路径

使用JavaScript脚本

发生在反安装、回滚。


3.1基本概念

ISAPI_Rewrite提供了一个基于规则的重写引擎能飞速重写被请求的URL。它支持几乎无限量的规则和几乎无限量的附加规则条件来提供真正灵活和有效的URL处理机制。可以根据HTTP头、服务器变量、被请求的URL本身以及其它不同的条件的测试结果来对URL作出处理。

URL数据处理是用一个文本配置文件来定制的内含各种指令设置。配置分几种等级。首先是全局服务器范围的配置指令放置在ISAPI_Rewrite安装目录里的一个名为httpd.conf的文件里。那里还有若干个标签可以封装应用到特殊位置的指令以及。最后ISAPI_Rewrite支持可以放在任何网站目录里的.htaccess文件那些文件中的规则可以应用到该位置以及它的子目录中。所有的配置文件在每次修改文件后都会被自动重载。允许用第三方程序和脚本来修改文件。

在很多情况下ISAPI_Rewrite是用来重写URL的。除了重写之外ISAPI_REWRITE能够修改、生成、删除任何其它客户端Reqst中的HTTP头。模块操作可以载入改写、代理、重定向或者阻断原始客户端到服务器的请求。

Rewriting可能使服务器在得到了一个客户端的源请求时用一个新的URL继续请求处理。新的URL可以包括查询串部分跟在问号后面也可以指向任何一个完全的静态文件或者脚本例如asp、或者程序例如.exe等等。对用户和网站配置来说重写是彻底透明的。因为它Web应用程序收到请求之前在服务器内部执行。

Proxying使URL经过内部处理后指向另一台服务器并很快传递到远程服务器上(换言之规则处理在这里中止了)。远程服务器的响应很快被传回客户端。代理服务器要求你指定完整的有效URL以协议、包括主机名开头等等。ISAPI_Rewrite使用ISAPI扩展来处理代理请求你可以在“代理服务器配置”这一章里读到更多信息。

Redirection将发送一个带有重定向指令的即时响应(HTTP响应码为302或者说301)将网址设置为一个新的位置。您可以在重定向指令里使用绝对URL格式这是RFC2616所要求的将请求重定向到不同的主机、端口和协议。如果此信息被忽略 ISAPI_Rewrite将自动照当前的协议、服务器名称和目录位置提供URL。重定向指令总是导致重写引擎中止处理后面的规则序列。

每个规则按它在配置文件中出现的顺序来应用。目录级配置文件从父路径开始一个接一个地处理来自于全局配置文件的规则最先适用。

在修改URL之前ISAPI_Rewrite会保存原URL到Http头命名为X-Rewrite-URL。然后它能够在脚本中作为HTTP_X_REWRITE_URL服务器变量取回。因为在IIS里系统变量名不能被修改所以ISAPI_Rewrite不能提供与Apache兼容的变量名REQST_URI。如果你的应用程序的设计要依赖于REQST_URI变量你必须修改它用HTTP_X_REWRITE_URL变量来代替。下面是一个PHP代码补丁的示例


 if (isset($_SERVER['HTTP_X_REWRITE_URL']))  {  $_SERVER['REQST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];  }后面跟有RewriteRule(或者RewriteProxy)指令的多重RewriteCond指令只影响单个规则。如果一些条件需要被用于多个规则必须重复写这些条件指令以应用到每条规则上。

3.2和Apache下mod_rewrite的兼容性

这个版本的ISAPI_Rewrite是为了最大程度上保持与Apache的mod_rewrite的兼容性。这个目标已经很大程度上实现了尽管有一些功能无法执行因为它们和Apeach以及UNIX结构高度绑定而且它们在IIS上执行是不敏感的。举例说明第H条“强制内容处理”标记不能执行因为在IIS中内容处理的范围依赖于扩展名。或者第[NS]条“没有子请求”标记是无意义的因为在IIS中是没有子请求的。

这里有一个完整的ISAPI_Rewrite和mod_rewrite兼容性图表。标记为绿色的功能或指令是充分支持的***的功能是部分支持或计划在下一版本中支持标示为红色的功能是不支持的。

· 兼容Perl的正则表达式 (plus extended syntax) 

· 服务器级httpd.conf配置

· 虚拟网站.htaccess配置文件

· 目录.htaccess配置文件

·  

·  

·  

·  

·  

·  

·  

· AccessFileName 

· RewriteEngine 

· RewriteRule 

o $N 规则后向引用

o %N RewriteCond 后向引用

o ${mapname:key|default} 

o %{VARNAME} 服务器变量

o '!' 取非

o [C] 与下一个规则联锁

o [CO=name:val:domain:lifetime:path] 设置cookie 

o [E=var:val] 设置环境变量

o [F] 强制禁止应答

o [G] 强制继续应答

o [H=content-handler] 明确的内容处理 (不适用) 

o [L] 上一个规则标记

o [N] 再次应用规则

o [NC] 大小写不敏感

o [NE] 不转义输出

o [NS]非内部子请求

o [P]代理通过

o [PT] 传递通过下一个处理程序 (一直开启) 

o [QSA] 追加查询字符串

o [R =code] 重定向

o [S=num] 跳到下面第 n条规则

o [T=MIME-type] 强制明确应答 MIME 类型

· RewriteCond 

o [NC] 大小写不敏感

o [OR] 逻辑并集

o %{HTTP:header} 

o '!' 非

o '

o '>CondPattern' 小于比较符

o '=CondPattern' 等于比较符

o '-d' 目录存在

o '-f' 文件存在

o '-s' 非零文件

o '-l' 符号链接

o '-x' 有可执行权限的文件

o '-F' 通过子请求文件存在

o '-U' 通过子请求URL存在

· RewriteBase 

· RewriteMap 

o txt: 文本映射

o rnd: 随机映射

o int: 内部函数 toupper, tolower, escape, unescape 

o prg: 外部程序

o dbm: 散列文件

· RewriteLog 

· RewriteLogLevel 

· RewriteOptions 

· RewriteLock 

· AllowOverride

3.3使用环境以及处理顺序

以下是这个程序文档中要被用到的使用环境的详解

server config

这个标志表示该指令可以用在全局httpd.conf配置文件中但是不能用在任何一个分区例如或者内部。它不允许放在.htaccess文件中。

vitr l host

这意味着指令可以出现在容器内。

directory

这个标志表示指令在容器内可用而且它们的正则表达式是等价的。

.htaccess

使用环境标为它的指令可以出现在每个目录的.htaccess文件中。记住当RewriteRule指令用在.htaccess配置文件中时它将自动从路径中剥去本地目录前缀只对剩下的部分应用规则。你可以使用RewriteBase指令显式地给这些规则指定一个基本路径。

应用次序

当同一分区内的多条指令同时适用时理解每个分区应用的次序是很重要的因为它会对最终效果起作用。应用次序如下所述

1.(正则表达式除外)多个分区可以应用于单个请求如果多个非正则表达式分区匹配了包含文档的这个目录或者它的上级目录中的一个则按照从短到长的匹配次序应用指令。

2..htaccess文件按父目录到子目录的顺序应用。

3.同时被执行。

4.也同时被执行。

先应用虚拟主机外面定义的相应分区和指令再应用分区中的分区和指令。同一时间只有一个分区可以应用给请求。较晚的分区优先于较早的那些。

3.4正则表达式

正则表达式语法指南是Rege++文档的一部分由John Maddock博士友情提供Copyright ?1998-2004包含在《Boost license》这本书里。完整的语法说明可以在《Boost.Regex documentation》中找到。

字面值

所的字符都是字面值除了“.”“*”“?”“+”“(”“)”“{”“}”“[”“]”“^”和“$”。当这些字符由“\”前导时也是字面值。一个字面值是个匹配它自己的字符。

通配符

点字符“.”匹配空字符和换行符以外的任何单个字符。

重复

重复是被重复任意次数的表达式。一个表达式跟着“*”可以被重复任意次数包括重复零次。一个表达式跟着“+”可以被重复任意次数但是至少重复一次。一个表达式跟着“?”可以被只重复零次或者一次。当需要明确指定重复的最低次数和最高次数时可以用限定运算符“{}”。这样“a{2}”是字母“a”重复两次。“a{2,4}”表示字母“a”重复2到4次。“a{2,}”表示字母“a”重复2到无限多次。注意“{}”里面必须没有空格。而且它没有对上限值和下限值限定范围。所有的重复表达式参考尽可能短的前子表达式一个单独字符一个字符集或者一个用“()”括起来的子表达式举几个例子

"ba*"匹配所有的"b","ba","baaa" 等等。

"ba+"匹配"ba"或"baaa"但是不匹配"b"。

"ba?"匹配"b"或者"ba"。

"ba{2,4}"匹配"baa","baaa","baaaa"。

懒惰型重复

在重复之后附加一个“?”就是懒惰型的重复了。一个懒惰型的重复是指匹配尽可能短的字符串。

例如匹配HTML标记对可以使用下面这样的正则表达式

"<\s*tagname[^>]*>(.*?)<\s*/tagname\s*>"

在这种情况下$1将包含标签对之间的文本而且是最短的匹配字符串。

插入成份

插入成分有两个用处——把项目编组到子表达式中并且对生成的匹配标号。例如表达式"(ab)*"将匹配所有的这类字符串"ababab"。所有的被插入成份标号的子匹配将可以用\N或者$N语法来回溯引用到。它允许子表达式匹配空字符串子表达式以1为开始从左往右编号。子表达式0就是整个表达式。

正则表达式

无标记插入

有时候你需要把子表达式编组为插入成份但是不想为这个插入成分而吐出另一个标记的子表达式。在这种情况下一个非标记插入(?:expression)可能有用。例如下例表达式可以创建一个非子表达式

"(?:abc)*"

N择1标记

当表达式可以匹配一个子表达式或另一个的时候N择1标记起作用了。每个N择1可以用|隔开。每个N择1标记是一个最大可能性前缀子表达式它是和重复操作符相反的行为。

示例

"a(b|c)"匹配"ab"或"ac"

"abc|def"匹配"abc"或"def"

预置符

一个预置符是一个可以匹配所有作为预置成员的单个字符的预置。预置字符用方括号“[”和“]”括起来可以容纳字面值、字符序列、字符类、经整理过的对象以及等价的类。用^打头的预置声明可以排除包含的内容。

示例

字面值

"[abc]"匹配"a"或"b"或"b"。

"[^abc]"匹配"a"和"b"和"c"之外的所有字符。

字符序列

"[a-z]"匹配所有的从"a"到"z"的字符

"[^A-Z]"匹配所有的字符除了从"A"到"Z"的这些字符。

字符类

字符类用语法"[:classname:]"来表示classname是声明过的预设值中的一个。例如"[[:space:]]"是所有的空白占位符的预设。下表中的字符类是可用的

 


alnum 所有的alpha数字字母 

alpha 字母表字符[a-zA-Z]。其它字符也可以包含在内这取决于本地环境 

blank 所有的空白字符包含回车或者空格 

cntrl 所有的控制字符 

digit 从0到9的数字 

graph 所有的图画字符 

lower 所有的小写字母[a-z]其它的字符也可以包含在内这取决于本地环境 

print 所有的印刷字符 

punct 所有的标点符号 

space 所有的空白占位符 

upper 所有的大写字母[A-Z]其它的字符也可以包含在内这取决于本地环境 

xdigit 所有的16进字字符0~9A-F 

word 所有的词汇字符包括字母数字外加underscore 

unicode 所有的编码大于255的字符这只对大范围字符特征类生效


这里有一些缩写法可以代替以上字符类

\w 代替 [:word:]

\s 代替 [:space:]

\d 代替 [:digit:]

\l 代替 [:lower:]

\u 代替 [:upper:]



正则表达式

集合元素

集合元素一般采用预置声明内加[.tagname.]的格式。其中tagname既可以是一个单个字符也可以是一个集合元素名。例如``.`a`.``等价于[a]``.`comma`.``等价于[,]。ISAPI_Rewrite支持所有的标准POSIX集合元素名以及下面的这些字符组合“ae”、“ch”、“ll”、“ss”、“nj”、“dz”、“lj”、任意小写、大写、首字母大写的变化组合。多个字符集合元素可以导致预置匹配一个以上的字符。例如``.`ae`.``将匹配两个字符但是[^[.ae.]]只会匹配一个字符。

等价类

等价类一般采用预置声明内加[=tagname=]的格式其中tagname既可以是单个字符也可以是一个集合元素的名称它能匹配同样的主要等价类成员的字符就跟集合元素[.tagname.]一样。一个等级类是一个相同整理的字符预设但主要是一个等价类的字符集其主要排序关键字都是一样的例如字符串通常先依字符整理然后根据重音然后根据大小写。主要排序键与字符相关次要与重音相关再次与大小写相关。如果没有等价类符合tagname则[=tagname=]是与[.tagname.]完全一样的。

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.].

要在一个预设中包含字面值“-”请这样做使它成为开放的“[”或者“[^”后面的第一个字符、一个系列或者一个集合元素的末点或者用一个前置的转义字符如“[\-]”。要在一个预设中包含一个字面值“[”或者“]”或者“^”请把它们作为一个系列或者一个集合元素的末点或者用一个前置的转义字符。

行锚

锚用来匹配一行开头或结尾的空串。“^”匹配行开头的空串“$”匹配行结尾的空串。

回溯引用

回溯引用是引用前面已经被匹配的子表达式。这个引用是被匹配的子表达式而不是表达式本身。回溯引用包括转义字符“\”跟着一个从1到9的数字。“\1”引用第一个子表达式“\2”引用第二个依次类推。举个例子表达式“(.*)\1”匹配任何关于它的中点重复的字符串比如说“abcabc”或者“xyzxyz”。一个对子表达式的回溯引用不参加任何匹配匹配空字符串。在ISAPI_Rewrite中所有的回溯引用是对整个RewriteRule和相应的RewriteCond指令是全局性相关的。RewriteRule指令中如果有RewirteCond子令的话子匹配从相应的RewriteRule指令的第一个RewriteCond指令开始从上到下从左往右编号。

向前查找

向前查找有两种形式正向前查找和负向前查找。

? "(?=abc)"匹配跟在表达式"abc"后面的零字符。

? "(?!abc)"匹配不跟在表达式"abc"后面的零字符。

通配符

下面的运算符提供了与GNU正则表达式库的兼容性。

? "\w"匹配任意单个组词字符它等价于表达式“[[:word:]]”。

? "\W"匹配任意一个非组词字符它等价于表达式“[^[:word:]]”。

? "\<"匹配词头空字符串。

? "\>"匹配词尾空字符串。

? "\b"匹配词头或者词尾空字符串。

? "\B"匹配词语中的空字符串。

转义字符

转义字符“\”含有多重意义

? 转义字符可以引导一个运算符例如回溯引用、词操作符

? 转义字符可以使下面的字符正常比如说“\*”代表一个字面值“*”而不是重复运算符。


单个字符转义序列

下面的转义序列是单个字符的别名


转义序列 字符代码 含义 

\a 0x07 信号铃记号. 

\t 0x09 制表符 

\v 0x0B 垂直制表符 

\e 0x1B ASCII转义字符 

\0dd 0dd 八进制字符代码其中dd是一个或多个八进制数字。 

\xXX 0xXX 十六进制字符代码其中XX是一个或多个八进制数字。 

\x{XX} 0xXX 十六进制字符代码其中XX是一个或更多十六进制数字可选用Unicode字符。 

\cZ z-@ ASCII转义序列control-Z其中Z是任意一个编码大于或等于“@”的编码的ASCII字符。


杂项转义序列

以下提供perl的大部分兼容性但是在\l、\L、\u和\U上有一些区别


转义序列 含义 

\w 等价于 [[:word:]]. 

\W 等价于[^[:word:]]. 

\s 等价于[[:space:]]。 

\S 等价于[^[:space:]]。 

\d 等价于[[:digit:]]。 

\D 等价于[^[:digit:]]。 

\l 等价于[[:lower:]]。 

\L 等价于[^[:lower:]]。 

\u 等价于[[:upper:]]。 

\U 等价于[^[:upper:]]。 

\C 任何单个字符等价于“.” 

\X 匹配任何Unicode组合字符序列例如“a\x0301”(字符a和一个尖角) 

\Q 开始引号运算符。后面跟前的所有的内容都被当作字面值直到发现一个\E结束运算符。 

\E 结束引用运算符终止一个由\Q开头的引用序列。


怎样得到匹配

正则表达式将匹配第一个可匹配字符串。如果从给定的起始处可以匹配到不止一个字符串则它会匹配那个能匹配得最长的字符串。如果从同一个起始处有多个合适的匹配而且每个匹配的长度都一样则将选择那个第一子表达式匹配得最长的匹配。如果有两个以上的匹配字符串它们的第一子表达式匹配得一样长则比较第二子表达式匹配的长度如此类推。注意ISAPI_Rewrite使用比封演算法。只有表达式匹配了整个顺序串才能得到匹配结果。例如

? RewriteCond URL ^/somedir/.* #将匹配任何导向somedir目录以及它的子目录的请求与此同时

? RewriteCond URL ^/somedir/ #只匹配somedir根目录的请求。

对“病态”正则表达式的特别提示

ISAPI_Rewrite 使用了一个非常强大的来自Boost库的正则表达式引擎。但是它依然有一些局限性有着一些“病态”的表达式它可能会指数级地消耗匹配时间。这些都涉及到嵌套重复运算符例如试图对N个连续字母a匹配表达式“(a*a)*b”消耗的时间将与N2成正比。这些表达式常常能改成另一种写法来避免这种问题。例如“(a*a)*b”可以被改写成“a*b”解析它消耗的时间与N成正比。在多数情况下非嵌套重复表达式消耗的时间与N2成正比但是如果条款是相互排斥的则它们会在线性时间里完成匹配。在“a*b”这种情况下每个字符将要么匹配a要么匹配b或者不匹配。相较之下“a*a”匹配器不能告知哪个分支被采取第一个 a还是第二个a因此必须尝试两种。

Regex可以检测出这种“病态”的正则表达式并终止和它们的匹配。这将使ISAPI_Rewrite的规则失效。当一个规则失效时ISAPI_Rewrite将给客户端发送一个"Internal Server error - Rule Failed"的状态以表示配置错误。


4.1AccessFileName指令


说明 设置分布式配置文件的名称 

语法 AccessFileName filename [filename] ... 

默认值 AccessFileName .htaccess 

使用环境 server config


指定一个ISAPI_ReWrite寻求分布式配置的文件名列表。默认文件名是.htaccess。ISAPI_ReWrite只能载入它能在这个列表中找到的第一个文件。默认情况下ISAPI_ReWrite管理者会以hidden属性标记配置文件-它将防止文件被远程用户直接访问到。

如果配置文件进行了任何修改它将在下次请求服务器时自动加载。


4.2AllowOverride指令


说明 明确规定了每个目录重写的基准URL。 

语法 AllowOverride All|None|directive-type [directive-type] ... 

默认值 AllowOverride All 

使用环境 server config, virt l host, directory


这个指令声明了在分布式.htaccess文件里的指令是否可以覆盖父级别的httpd.conf中的指令。在ISAPI_Rewrite的使用环境中这个指令实际上控制了特定虚拟主机或者目录的.htaccess文件的可用或者不可用。目前只支持三个值All、None和FileInfo。

All和FileInfo使.htaccess文件以及它里面的整个ISAPI_Rewrite目录可用None使所有的.htaccess文件以及目录不可用。这些目录具有继承性。这意味着如果你为一些目录或者虚拟主机指定AllowOverride none.htaccess文件将对整个子目录树不可用。


4.4RewriteRule指令


说明 定义URL重写规则 

语法 RewriteRule Pattern S stitution [flags] 

使用环境 server config, virt l host, directory, .htaccess


这个指令定义了单个URL重写操作。它可能在一个配置文件中出现多次每个实例定义一个重写URL的规则。RewriteRule指令包含URL匹配模式、替换字符串以及可选的标志设置。

Pattern模式是一个用来匹配当前URL的Perl兼容正则表达式。当前的URL可以是原来请求的URL或者已经由优先级高的规则替改过的URL。网址从不包含协议或者主机名从第一个斜杠字符开始只对httpd.conf文件适用。而且当前网址还因不同的应用配置级别而异。对于目录级配置.htaccess文件结尾的斜线和配置文件的目录名会在匹配时被从URL中忽略掉。在创建正则表达式时请阅读这个文档的正则表达式语法部分来得到更多的信息。

"!"字符打头的模式将否定整个表达式。否定模式不能产生子匹配所以你不能使用$N的替代引用。

S stitution(替换)字符串指定了模式是匹配时生成URL的格式字符串。除了纯文本它可以包括这些特殊字符。

? 对Rewrite模式的回溯引用 $N

? 对Rewrite模式的回溯引用 %N

? 服务器变量 %{VARNAME}

? 条件格式模式 Ntr_string:false_string 

? 分组括号“(”和“)”

替换字符串将所有的字符视为字面值除了$'、'\'、'('、')''?'':'和'\'。为了字面化地读出特殊字符它定义了用"\"引导的转义字符。下面的特殊字符是允许的。


$& 输出匹配的整个表达式。 

$` 输出上一个的匹配结束到当前匹配的开始之间的文本(如果之前没有找到匹配串则输出从开头到当前匹配的开始之间的文本)。 

$' 输出当前匹配之后跟着的所有文字。 

$$ 输出字面值$ 

\a 信号铃字符 

\f 表单反馈字符 

\n 新行字符 

\r 回车符 

\t 制表符 

\v 垂直制表符 

\x 十六进制字符比如说\x0D. 

\x{} 一个可能的Unicode十六进制字符-例如\x{1A0} 

\cx ASCII的转义字符x例如\c @等价于escape-@。 

\e The ASCII 转义字符 

\dd 八进制字符常量例如\10。 

\l 导致下一个字符被小写输出。 

\u 导致下一个字符被大写输出。 

\L 导致整个后继字符串被小写输出直到遇到\E。 

\U 导致整个后继字符串被大写输出直到遇到\E。 

\E 结束\L或者\U的后续字符串 

\\ 单个反斜杠字符'\'


RewriteRule从父配置文件开始按照在配置文件中出现的次序应用。每个规则只有在它的Pattern匹配了一个URL而且所有连接条件RewriteCond都匹配时才会被应用。在该URL用S stitution完成替换之后重写过程还在继续一直到配置文件结束或者遇到一个用了任何停止标志的规则。在S stitution中的特殊字符串"-"(短横)意味着没有替换而且当你需要应用该规则并留下的原始的未被染指过的URL时它是很有用的。

此外这里有一个支持的flag(标志)列表。这些标识可以改变规则的表现。与Apache完全兼容的标志被标记为绿色不支持的标志被标记为绿色只在 ISAPI_Rewrite中被支持的标识被标记成***。

CU (Case Upper)

把替换字符串改成大写.

CL (Case Lower)

把替换字符串改成小写.

chain|C

将当前规则与后一条规则链接起来后一条规则只有在当前规则被匹配的情况下才能被执行。链接可以再后续链接。

cookie|CO=NAME:VAL:domain[:lifetime[:path]]

设置一个有指定字段的cookies头并把它和当前请求的响应一起发送到客户端。

env|E=VAR:VAL

不支持在UNIX环境中设置一个环境变量在Windows系统中无意义。

forbidden|F

发送即时403 FORBIDDEN响应到客户端停止这个请求的规则处理以及所有其他的替换处理。

gone|G

发送一个即时401Gone响应到客户端停止这个请求的规则处理以及所有其他的替换过程。

handler|H=Content-handler

不支持为请求明确指定了处理处理。在IIS的世界中这是可以通过重写请求的文件扩展名来实现。但是没有从Apache处理到IIS文件扩展名的直接转换方法。

last|L

停止这里的重写处理不再应用当前配置文件中的其它规则。在这种情况下后代的.htaccess文件依然能被用到。

loop|LP

在一个循环中重复运行当前单个规则直到它的模式以及条件不再被匹配了。循环次数被限定为200免得陷入无限循环。

next|N

从当前配置文件开始处重复运行重写处理。循环次数被限定为200免得陷入无限循环。

nocase|NC

这个标记使Pattern大小写不敏感。

noescape|NE

不转义输出。在ISAPI_Rewrite默认情况下在输出中会把所有的非ANSI字符编码为十六进制数%xx。

nos req|NS

这个标识在ISAPI_Rewrite中与在Apache中含义不同。精确的转换是不可能的但这个标志可能仍然是有用的。每当配置文件处理完成之后URL被重写了ISAPI_Rewrite将启动这个新的URL处理过程与Apache相同使它可以应用到另一个配置文件中。此标识意思是该规则只针对初始用户的请求执行不针对已被重写过的请求执行以防可能出现的循环。ISAPI_Rewrite限定循环重复次数为10。

nounicode|NU

如果设置了NU标记从Unicode转换为UTF - 8将不会发生。所有Unicode字符会保持它的%xx格式不变。

O (nOrmalize)

留着用于与ISAPI_Rewrite 2.x兼容。如果使用了RewriteCompatibility2这个指令在处理之前将URL规范化。规范化包括移除一个URL编码、错误字符等等。同时URL的规范化将完全移除它的查询字符串。如果RewriteCompatibility2 没有被使用URL按照默认被规范化就如同它在mod_rewrite中所做的此标志的含义将反转。

proxy|P

将结果URL强制内部处理为另一台服务器上的目标并即时传到远程服务器上并且规则处理在这里中断了。远程服务器的响应将被传递回客户端。proxy需要您指定完整的URL由协议、主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你可以在代理配置章节中阅读到更多有关于此的内 容。

passthrough|PT

不支持或者始终支持。在IIS中结果始终传递到下一个处理

qsappend|QSA

追加当前查找串的数据到替换串而不是由一个替换字符串取代它。当你需要在保留原来的参数再添加更多的查询字符串参数时可以使用它。

redirect|R [=code]

强制服务器用重定向指令给客户端发送一个即时响应提供一个新的接替位置。可以选加前缀http://thishost[:thissport]/从而把URL带到一个可用的绝对形式。如果没有给出代码将使用一个302响应(暂时性移动)。你可以选择在3XX系列范围内指定任何代码。

skip|S=num

如果当前的规则匹配强制rewrite引擎跳过后面num个规则。

type|T=MIME-type

强制目标文件的MIME类型转换成被设定的MIME类型。这能够被用来根据一些条件设置内容类型。

U (Unmangle log)

无损记录。记录它原来请求的网址而不是被重写的URL。


4.5RewriteCond指令


说明 为以下的RewriteRule定义一个条件 

语法 RewriteCond TestString CondPattern 

使用环境 server config, virt l host, directory, .htaccess


该指令为后面的RewriteRuleRewriteHeader或RewriteProxy指令规定了一个条件。一个规则指令前可以有一个或多个条件规则只有在所有条件得到满足的情况下才被应用。

TestString附加到纯文本可以包含下列结构。

? 用语法$N回溯引用RewriteRule模式

? 用语法%N回溯引用前面的RewriteCond模式

? 用语法${mapname:key|default}扩展RewriteMap

? 用语法%{HTTP:header}指代HTTP头值

? 用语法%{NAME_OF_VARIABLE}指代服务器变量

以下是可用的服务器变量列表


HTTP_USER_AGENT

HTTP_REFERER

HTTP_COOKIE

HTTP_FORWARDED

HTTP_HOST

HTTP_PROXY_CONNECTION

HTTP_ACCEPT

REMOTE_ADDR

REMOTE_HOST

REMOTE_PORT

REMOTE_USER

REMOTE_IDENT

REQST_METHOD

SCRIPT_FILENAME

PATH_INFO

QRY_STRING

AUTH_TYPE DOCUMENT_ROOT

SERVER_NAME

SERVER_ADDR

SERVER_PORT

SERVER_PROTOCOL

SERVER_SOFTWARE

API_VERSION

THE_REQST

REQST_URI

REQST_FILENAME

HTTPS TIME_YEAR

TIME_MON

TIME_DAY

TIME_HOUR

TIME_MIN

TIME_SEC

TIME_WDAY

TIME

另外所有的IIS特有的变量都是支持的。


CondPattern指定一个应用于TestString实例的正则表达式以下特殊值也支持

1.在正则表达式前头加“!”符号指明否定模式。

2.'

3.'>CondPattern'按字典顺序比较结果比较小

4.'=CondPattern'按字典顺序比较结果相等

5.'-d' 检测字符串是否存在目录。

6.'-f' 检测字符串是否存在文件。

7.'-s' 检测字符串是不是一个非零大小的文件。

8.'-l' (链接) 不支持的始终为false。

9.'-x' (拥有可执行权限) 不支持的始终为tr。

10.'-F' (存在的文件通过子请求) 不支持和'–f'一样。

11.'-U' (存在的URL通过子请求) 不支持的始终为false。

下面的标记也是支持的

'nocase|NC'

这个标记使模式大小写不敏感。

'ornext|OR' 

这个标记用逻辑或而不是隐含的逻辑与结合子请求RewriteCond指令。

O

留用于ISAPI_Rewrite 2.x的兼容性。在处理前规范化字符串。规范化包括移除一个URL编码、错误字符等等。同时URL的规范化将完全移除它的查询字符串。


4.6RewriteBase指令


说明 为每个目录的重写设置一个基准的URL 

语法 RewriteBase URL-path 

默认值 RewriteBase reqsted-directory-path 

使用环境 directory, .htaccess


当RewriteRule指令用于每个目录的配置文件(.htaccess)时它将自动从路径中剥去本地目录前缀只对剩下的部分应用规则。RewriteBase指令允许你为这些规则精确指定一个基准。比如哪部分要被剥离。

和Apache的mod_rewrite不同ISAPI_Rewrite的访问不仅仅针对于物理路径同时还针对于虚拟路径而且可以自动地选择正确的基准。所以这个指令只是为了兼容性原因而被保留的。

URL-path可以是相对于根的路径也可以是空空的URL-path意味着规则的基准等同于网站的根目录。


4.7RewriteProxy指令


说明 代理请求到一个远程服务器 

语法 RewriteProxy Pattern S stitution [flags] 

使用环境 server config, virt l host, directory, .htaccess


使结果URL被内部处理为另一台服务器上的目标并即时传递到远程服务器从此中断了规则处理。远程服务器的响应将被传递回客户端。代理要求您指定完整的URL由协议主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你可以在配置代理的章节里阅读到更多。

语法和操作符与RewriteRule指令是相同的。但是RewroteProxy指令支持一些额外的标记。

H (preserve Host)

代理模块在连接远程服务器时将使用随着源请求一起发送过来的主机头如果没有这个标志代理服务器则将用主机名和远程服务器的端口号组成主机头。

A (Add authentication headers)

允许从代理服务器将一个认证信息传递到局域网服务器上当客户端认证和代理服务器冲突时它很有用。服务模块将对一个请求的服务器变量


AUTH_TYPE,  AUTH_USER,  LOGON_USER,  REMOTE_USER追加相应的头


X-ISRW-Proxy-AUTH-TYPE,  X-ISRW-Proxy-AUTH-USER,  X-ISRW-Proxy-LOGON-USER,  X-ISRW-Proxy-REMOTE-USER到被代理的服务器。

CR (use Credentials)

代理模块将尝试用在URL中指定的证书身份验证登录远程服务器或者用基本身份验证头登录远程服务器。用了这个标志你可以在一个替换字符串中使用http://user:[email protected]/page语法作为一个URL。


4.8RewriteHeader指令


说明 重写任何请求的HTTP头 

语法 RewriteHeader HeaderName: Pattern S stitution [flags] 

使用环境 server config, virt l host, directory, .htaccess


这个RewriteHeader指令是RewriteRule指令中的一个很常用的变量。而且它被设计用来重写客户端的URL部分以及HTTP头的部分。技术上的RewriteRule指令相当于RewriteHeader的URL Pattern S stitution [flag]。这个指令可用于在IIS里更多应用程序的处理之前重写、创建或者删除任何客户端请求的HTTP头。

HeaderName指定将被重写的HTTP头的名字。

pattern、S stitution和flag与RewriteRule指令中都是相同的。


4.9RewriteMap指令


说明 为一个映射函数值定义一个键 

语法 RewriteMap MapName MapType:MapSource 

使用环境 server config, virt l host, directory, .htaccess


RewriteMap指令被用来定义一个键到值的查找功能。当你需要映射大量的值时它会很有用的而且它的速度远远快过用规则匹配来做到它。映射功能的性能受映射文件的大小影响微乎其微。有三种类型的映射

? txt用一个文本文件映射

? rnd从多个可选项中产生随机值

? int内部函数

MapName是这个映射功能的名字在RewriteRule命令中被用来指定这个映射。请确保每个映射用唯一的名称定义。你可以使用以下语法在RewriteRule指令的S stitution参数中调用映射功能


${ MapName : LookupKey | DefaultVal } 如果这个结构是在S stitution中出现ISAPI_Rewrite将在映射中查找这个键万一找到了一个就用它的值替换这个结构。如果什么值也没有被找到将用可选的DefaultVal。如果没有指定DefaultVal它将用一个空串替换。

下面的标志也是支持的

‘nocase|NC’

这个标志使该查找键大小写不敏感。

下面是一个大小写不敏感映射文件指令的示例


RewriteMap examplemap txt:C:/path/to/file/map.txt [NC]到MapSource文件的路径既可以是绝对地址也可以是相对地址。相对地址将被从当前配置的文件夹开始推算换言之就是从这个定义映射的配置文件的路径开始推算。

然后你可以在RewriteRule中如下使用这个映射


RewriteRule ^/ex/(.*) ${examplemap:$1}下列MapType和MapSource的组合是可用的

txt纯文本映射它的source是到一个可用的文本文档的windows文件系统路径。文本文档必须是如下格式的


#This is a comment  key1 val1 #Another comment  key2 val2  keyN valNrnd随机查找多个值。Source是一个文本文档的路径文本文档必须是以下格式


#This is a comment  key1 val1|val2|val3  key2 val4|val5|val6|valNint: 调用内部函数。 Source必须是下列预定义的内部函数之一

? toupper: 转换关键词为大写形式。

? tolower:转换关键词为小写形式。

? escape:把特定字符编码为十六进制。

? unescape:把十六进制值编译为特定字符。


4.10RewriteLog指令


说明 设置ISAPI_Rewrite日志文件的名称 

语法 RewriteLog file-path 

默认值 RewriteLog installdir\rewrite.log 

使用环境 server config


这个指令用来设定记录ISAPI_Rewrite动作的日志文件的文件名。示例


Rewritelog "C:\local\path\rewrite.log"4.11RewriteLogLevel指令


说明 设置日志级别 

语法 RewriteLogLevel Level 

默认值 RewriteLogLevel 0 

使用环境 server config


这个指令设置日志的输出长度。默认值0表示不记日志而最大的级别9则表示所有的动作都要记录。

使用使用较高的级别值可能会降低ISAPI_Rewrite的操作速度。我们建议你当你完成规则调试之后通过设置日志级别为零来禁用日志。


4.12RewriteOptions指令


说明 指定特殊选项 

语法 RewriteOptions Options 

使用环境 server config, virt l host, directory, .htaccess


这个指令可以为ISAPI_Rewrite设置特定选项。当前只有惟一一个选项可用inherit。

inherit强迫当前配置从父级继承所有的选项和规则。这意味着来自父级配置的所有的规则将被再次执行除非当前环境另有相应重写规则。


4.13RewriteCompatibility2指令


说明 启用或禁用ISAPI_Rewrite 2.x兼容模式 

语法 RewriteCompatibility2 on|off 

默认值 RewriteCompatibility2 off 

使用环境 server config, virt l host, directory, .htaccess


这一指令将激活与ISAPI_Rewrite 2.x版的兼容性将一些2.X的规则正确地翻译为3.0版本的语法。这并不意味着ISAPI_Rewrite 3将开始懂得不经修改旧的语法。如果您有针对ISAPI_Rewrite 2.X的旧设计请使用ISAPI_Rewrite提供的翻译工具将这些旧规则转化为新的语法规则。

现在通过设置指令RewriteCompatibility2唯一改变的是它将关闭网址常规前缀并删除查询字符串。 Apache的mod_rewrite将删除匹配的URL的查询字符串的这部分相较之下ISAPI_Rewrite 2.X将匹配整个网址包括查询字符串在内而且[O]标记的意思将由该指令倒置。


4.14ErrorLog指令


说明 一般的错误文件的位置 

语法 ErrorLog file-path 

默认值 ErrorLog installdir\rewrite.log 

使用环境 server config


这个指令设置存放ISAPI_Rewrite整体错误和消息的日志文件的名称。例如httpd.conf file load, .htaccess file load,等等

例ErrorLog "C:local\path\error.log"


4.15LogLevel指令


说明 设置一般的错误的日志级别 

语法 LogLevel Level 

默认 LogLevel warn 

使用环境 server config


这个指令设置一般日志的输出长度跟它的重写过程无关。这里有一个level的可用值列表emerg、alert、crit、error、warm、notice、info、debug。当前的ISAPI_Rewrite日志只记录错误信息。

设置LogLevel调试来解决配置文件中加载的问题。


4.16指令


说明 把应用于特定IP地或者主机的指令编组 

语法 ...  

使用环境 server config


... 标签用来对应用到特定虚拟主机里的指令进行分组。

addr的可用值为

? 特定的IP地址

? 完整的域名

? 字符'*'可以匹配任何主机或者特定服务器的任何端口号。

例如


RewriteEngine off  AllowOverride none    RewriteEngine on  AllowOverride all   不要忘了在每个标签中包含RewriteEngine on指令也不要将不能应用的规则封装进去。


4.17指令


说明 将适用于特定的文件系统的目录和子目录的指令编组 

语法 ...  

使用环境 server config, virt l host


... 标签被用来对应用到特定文件系统目录以及子目录的指令进行分组。通配符?和*是可用的。正则表达式也是可用的需要以~字符打头。

对目录路径参数必须小心它们必须字面匹配用来访问文件的文件系统路径用于某一特定的指令并不适用于来自同一目录下通过不同的路径的文件访问例如通过不同的符号链接。只有完整的文件路径是被允许使用的。

示例


   AllowOverride None        AllowOverride FileInfo        # ... directives here ...  不要忘了在每个标签中包含RewriteEngine on指令也不要将不能应用的规则封装进去。


4.18指令


说明 将适用于特定的文件系统的目录和子目录的指令编组 

语法 ...  

使用环境 server config, virt l host


... 被用来封装一个只适用于指定的文件系统的目录和子目录的指令组。这个指令和 语法相同。

示例


    # ... directives here ...   不要忘了在每个< DirectoryMatch>标签中包含 RewriteEngine on指令也不要将不能应用的规则封装进去。


4.19 指令


说明 将应用于匹配文件名的指令包装起来 

语法 ...  

使用环境 server config, virt l host, directory, .htaccess


指令以文件名限定了封装的指令的作用域。filename参数必须包含一个文件名支持?和*以及以~字符打头的正则表达式。

示例


    # ... directives here ...         # ... directives here ...   不要忘了在每个标签中包含RewriteEngine on指令也不要将不能应用的规则封装进去。


4.20指令


说明 将应用于匹配文件名的指令包装起来 

语法 ...  

使用环境 server config, virt l host, directory, .htaccess


指令的语法和_指令">语法完全一样。


不要忘了在每个标签中包含RewriteEngine on指令也不要将不能应用的规则封装进去。


4.21指令


说明 把被包装起来的指令集应用到匹配的URL或者虚拟路径 

语法 ...  

使用环境 server config, virt l host


... 标签用来将应用到特定URL或者虚拟路径的指令分组。将运算符完全从文件系统中分划出来因此那些指令将不会用来控制对文件文件系统位置的访问。因为有几个不同的URL可能映射到相同的文件系统位置。

该URL-path是一个形式为“/path/”的虚拟路径。没有协议、主机名、端口号、查询请求字符串被包含在内。URL-path可以包含通配符?和*或者以~字符打头的正则表达式。

示例


   # ... rules go here         # ... more rules go here  不要忘了在每个标签中包含RewriteEngine on指令也不要将不需要用到的规则封套进去。


4.22指令


说明 把被包装起来的指令集应用到正则表达式匹配的URL上 

语法 ...  

使用环境 server config, virt l host


这个指令的语法和指令">正则表达式语法完全一样。

示例


    # ... rules go here   不要忘了在每个标签中包含RewriteEngine on指令也不要将不能应用的规则封装进去。



示例

注意这些示例中所有的规则只适用于httpd.conf文件。在ISAPI_Rewrite以及在Apache的mod_rewrite中规则的基本路径是不同的取决于你放置.htaccess文件的目录。如果你将规则放在httpd.conf里的话初始领头斜线必须存在而在.htaccess文件中到这些文件的虚拟路径会被截断。规则取决于以RewriteBase /指令引导的根路径来允许它们在httpd.conf和目录级的.htaccess文件的任何位置上运作。

简单的搜索引擎友好的网址

下面这个例子演示了如何轻松地使用循环标记藏匿查询字符串参数。假设你有一个如下的URLhttp://www.mysite.com/foo.asp?a=A&b=B&c=C而且你希望以这样的地址来访问它http://www.myhost.com/foo.asp/a/A/b/B/c/C

请尝试用下面的规则来达到预期的效果


 RewriteEngine on  RewriteRule ^(.*?\.asp)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,LP,QSA]注意这个规则可能破坏页面与CSS文件、图片等的相对链接。至所以这样是因为在浏览器中用于推算完整资源URI的基本路径页面的父文件夹发生了变化。只有在您使用目录分隔符作为替代字符时才会发生这个问题。有三种可用的解决方案

1使用下面的规则它不影响基本路径因为它没有用到目录分隔符“/”。

2借助于标签直接为页面指定正确的base路径

3把所有的页面相对链接都变成相对于根目录的地址或者绝对地址形式。

还存在着很多种用了不同的分隔符和文件扩展名的规则。例如使用像这样的URLhttp://www.myhost.com/foo.asp~a~A~b~B~c~C。下面的规则可以用来实现它


 RewriteEngine on  RewriteRule ^(.*?\.asp)~([^~]*)~([^~]*)(.*) $1$4?$2=$3 [NC,LP,QSA]富关键词URLs

在上面的例子中我们使用很一般的技术来简单地藏匿查询字符串标记。但是很多对搜索引擎优化很有用的解决方案是让您的URL关键字丰富。看看下面的网址例如http://www.mysite.com/prod tpage.asp?prod tID=127这是大部分网站的常见情况。但是你可以通过使用这样形式的链接来显著地提高你的网页搜索引擎抓取率http://www.mysite.com/prod ts/our_super_tool.aspURL中的关键词“our super tool”会被索引并提高网页排名但是“our_super_tool”不能直接被用来收回prod tid=127这个问题存在几种解决方案。

第一个解决方案我们建议你使用简短、只包含少数几个参数既有关键词也有数字标识符的URL形式在样您的URL可能看起来如下

http://www.mysite.com/prod ts/our_super_tool_127.asp。实现这一重写目标只需要一个规则


 RewriteEngine on  RewriteBase /  RewriteRule ^prod ts/[^?/]*_(\d+)\.asp /prod tpage.asp?prod tID=$1 [QSA]


另一个更复杂的解决方案是创建一对一的映射文件并用它来映射“our_super_tool”到127。该解决方案对一些有很多参数的长URL来说很有用并允许你隐藏数字标识符。这URL看起来像是http://www.mysite.com/prod ts/our_super_tool.asp。请注意“our_supper_tool”部分必须是产品的唯一标识是它的标识符。下面是这种解决方案的一个示例


RewriteEngine on  RewriteBase /  RewriteMap mapfile txt:mapfile.txt  RewriteRule ^prod ts/([^?/]+)\.asp /prod tpage.asp?prod tID=${mapfile:$1}而且你必需创建包含以下内容的mapfile.txt映射文件


one_prod t       1  another_prod t   2  our_super_tool    127  more_prod ts     335这种方法的优点是你可以使用它来组合十分复杂的URL转换但是这是一个小例子是这个指南中的题外之话。

使用IIS作为反向代理 假设你有运行IIS的互联网服务器以及几台后台服务器或者应用程序运行在其它平台或者机器上。这些服务器不能直接在互联网上阅览但是你必须为他人提供访问这些服务器的渠道。这里有一个演示如何简单地将某个网站的完整内容映射到另一个运行了ISAPI_Rewrite的站点的文件夹的示例


RewriteEngine on  RewriteBase /   RewriteRule mappoint(.+) http://sitedomain$1 [NC,P]藏匿文件扩展名 虽然不可能将一个站点的所有的文件的扩展名都藏匿起来但是我们可以使用ISAPI_Rewrite的文件检查功能来隐藏某些已知扩展名。这里有一个藏匿网站上.asp文件扩展名的规则示例


RewriteEngine on  #Redirect extension reqsts to avoid duplicate content  RewriteRule ^([^?]+)\.asp$ $1 [NC,R=301,L]  #Internally add extensions to reqst  RewriteCond %{REQST_FILENAME}.asp -f   RewriteRule (.*) $1.asp仿真基于主机头的虚拟网站 例如你已经注册了两个域名www.site1.com和www.site2.com。现在你可以使用同一个物理站创建两个不同的站点了。这里是一个规则示例


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] 现在只要把你的站点分别放到/site1和/site2目录下就可以了。注意www.site1.com和www.site2.com这两个域名必须在IIS中被映射到这个网站里从而使ISAPI_Rewrite能拦截到请求。

或者你可以使用更多通用的规则从而把任何请求都映射到与请求主机名同名的文件夹里。


RewriteEngine on  #Fix missing trailing slash char on folders  RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]  #Map reqsts to the folders  RewriteCond %{HTTP:Host} ^(www\.)?(.+)  RewriteRule (.*) /%2$1 [NS]网站的目录名应该是这样子的/somesite1.com/somesite2.info等等。

阻断内联图像阻止盗链 假如你有一些页面插入了http://www.mysite.com/下的gif图片。一些其它站点将通过网页超链接插入这些图片。这会给你的网站增加很多无用的通讯量而且你希望阻止这种做法。

虽然用ISAPI_Rewrite不能100%地保护图片不被盗链只有专门的反盗链产品才能做到它你至少可以在浏览器发来HTTP引用头的时候限制这种情况。下面的规则可以让你只允许来自同一主机的引用页或者空地址访问到这些图片。


RewriteEngine on  RewriteCond %{HTTP:Host}#%{HTTP:Referer} ^([^#]+)#(?!http://\1).+  RewriteRule .*\.(?:gif|jpg|png) /block.gif [NC]重定向非www的版本到www

如果你的网站同时可以通过两种形式的URL比如说http://helicontech.com和http://www.helicontech.com来访问到那么最好将一种地址重定向到另一种地址里来避免搜索引擎对重复内容做出的处罚。下面是一个能将所有的非www地址重定向到相应的www地址上去的301重定向规则。


RewriteEngine on  RewriteCond %{HTTPS} (on)?  RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]  RewriteCond %{REQST_URI} (.+)  RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]强制SSL或者非SSL到一个指定的位置

这里是一个演示如何将SSL强制转到指定的文件夹的示例。只要简单地把下面的规则放到该文件夹下的.htaccess文件里就可以了。


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 %{REQST_URI} (.*)  RewriteRule .?https://%1%2 [R,L]而这个示例作用正好相反将非SSL强制转到指定文件夹。


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 %{REQST_URI} (.*)  RewriteRule .?http://%1%2 [R,L]转移站点位置

当你把网站从一个域名移到另一个域名或者从一个文件夹移动另一个文件夹里的时候这是经常会遇到的问题。你希望将一个网站的所有请求重定向到另一个网站里而且不丢失请求资源名以及参数。当你希望保留现有的网页的排名和外链接的时候它是非常有用的。这个解决方案是在旧的网站服务器上使用ISAPI_Rewrite


RewriteEngine on  #Permanent redirect to update old links  RewriteRule (.+) http://newserver.com$1 [R=301,L]平衡负荷仿真

这个示例模拟某种DNS轮换负荷平衡技术。假设你有主站www.mysite.com和数台web服务器分别注册为www[1-9].mysite.com。如果你在主服务器上安装了ISAPI_Rewrite你可以将初始的客户端请求重定向到几台特定服务器从而在几台服务器之间随机摊开通讯量。一旦已重定向客户端将一直使用这一台服务器。虽然这种解决方案并不非常理想但是它确实能分摊你的通讯量并避免在维护会话状态方面发生的问题。

使用下面的规则来重定向客户端


RewriteEngine on  RewriteMap hosts rnd:hosts.txt  RewriteCond %{HTTP:Host} (www)\.mysite.com [NC]  RewriteRule (.*)http://${hosts:%1}.mysite.com$1 [R,L]下面是hosts.txt文件的内容


www www1|www2|www3|www4|www5|www6|www7|www8|www9你还可以在Apeche文档里找到很多其它有用的例子。它们多数不需要修改就可以在ISAPI_Rewrite3里使用。



故障处理

Chapter 6故障处理

在这里你可以一步步找到你在安装ISAPI时遇到的问题的解决方法。

1.首先要正确解决您的问题我们需要你运行最新的可用版本的ISAPI_Rewrite软件。你可以随时到我们的网站下载最新版的软件来升级你的ISAPI_Rewrite。地址是http://www.helicontech.com/download-isapi_rewrite3.htm 。

2.多数运行ISAPI_Rewrite的问题发生在服务器上NTFS权限限制上。所以请先阅读需要运行ISAPI_Rewrite文件的权限。

3.请检查应用程序和系统日志中的错误信息。这可能指出您的错误原因。

4.不要忘记设置RewriteEngine on指令在你所用的每个配置文件中。

5.把下列代码行放到httpd.conf文件中


 RewriteLogLevel 9  LogLevel debug它将创建error.log和rewrite.log两个日志文件默认放在安装目录下。如果日志文件被创建了它表明ISAPI_Rewrite正在运行。阅读作为结果的error.log和rewrite.log文件将能告诉你一些问题的根源线索。

6.如果httpd.conf规则正在生效但是.htaccess文件却没有载入请再次检查.htaccess文件的NTFS权限并确保你没有在使用ISAPI_Rewrite的精简版。

7.如果规则在httpd.conf里能生效但是有其它部分或者.htaccess文件里不能生效请确保在每个部分的或者.htaccess文件里包含RewriteEngine on指令。同样的不要忘掉.htaccess文件里的默认rewriting base值与httpd.conf是不同的。在.htaccess文件里或者部分里ISAPI_Rewrite会自动从路径中剥离本地目录前缀并只对剩下的部分应用规则。所以如果你的规则以“/”字符开头的话在网站根目录的.htaccess文件中它必须被去掉。

如果你在使用ISAPI_Rewrite时依然有问题请到技术支持论坛里来写下你的问题或者发送电子邮件到技术支持邮箱里。

请在您的支持请求里包括以下信息

1.您的ISAPI_Rewrite配置文件包括路径和文件名。

2.您的网站的地址链接。

3.你用到测试你的规则的URL。

4.与失败的请求error.log和rewrite.log的文件副本。

5.包括失败的请求的部分IIS日志文件。

请记住你提供的信息越多我们越容易为你解决问题。这样你更有机会快速地得到解决方案。


ISAPI_Rewrite 发布历史

发布 3.1.0.67

================

[筛选器功能] 增强映射文件的动态加载

[代理帮助文件错误]如果后端不设置内容长度头的话并不会返回所有的响应。

发布 3.1.0.66

================



精简版的限制

ISAPI_Rewrite的精简版拥有相同的引擎和重写功能。但是也有下面这些限制

不支持分布式.htaccess配置、目录以及网站级配置只有一个精简版安装目录中的全局的httpd.conf配置能被载入。

不支持 以及这几个标签。

精简版中没有代理服务模块因而所有的和代理服务功能相关的比如说RewriteProxy指令以及[P]标记都会被忽略。

精简版没有针对于虚拟主机环境的手工安装包

ISAPI_Rewrite精简版完全免费它对开发或者测试目的以及只有几个网站而且不需要分布式配置或者代理功能的小型服务器来说是一个很好的解决方案


技术信息 ISAPI_Rewrite由四个部分组成ISAPI筛选器、ISAPI扩展帮助、GUI管理器以及MMC嵌入式管理单元扩展。ISAPI_Rewrite筛选器和扩展都是用纯C++语言写的快速DLL模块。当安装ISAPI_Rwrite的时候 MMC嵌入式管理单元会被自动注册。ISAPI筛选器将安装在一个全局级别上你不需要手工注册它。ISAPI扩展也会被安装并注册。

ISAPI_Rewrite管理器实用工具可以在没有安装MMC的系统中运行ISAPI_Rewrite MMC嵌入式管理单元。

Windows Vista以及Windows Server 2008系统中的ISAPI_Rewrite管理器实用工具(Helicon Manager.exe)要求管理员权限来执行因为较小权限的用户没有权力读取IIS管理元库而它对显示网站配置来说是必需的。如果用受限的帐号运行ISAPI_Rewrite管理器你会得到登录管理员帐号的自动提示。

ISAPI_Rewrite筛选器已经有足够地快因此不用担心它的性能。除非你的服务器运行在最大负荷之下。用户在响应时间或者CPU负荷方面几乎不能发现什么区别但是如果用了很多的规则的话服务器最大带宽可能掉下一点来。所以请注意你用的配置决定了性能。建议每个网站使用的规则不要超过100条。在多数情况下可以利用RewriteMap来避免使用大量的规则。

该程序使用了Regex++ 库。

Regex++ (Version Boost 1.31)

Copyright ?1998-2004, Dr John Maddock


使用和传播许可

该使用许可覆盖了所有的现有版本的ISAPI_Rewite包括ISAPI_Rewrite、ISAPI_Rewrite完全版、ISAPI_Rewrite精简版、ISAPI_Rewrite测试版后面统称为ISAPI_Rewrite除非另有指明。

1.所有未明确授予的权利均由Helicon Tech保留。

2.所有的关于ISAPI_Rewrite的版权都由它的作者Helicon Tech独家保留。

3. Helicon Tech准予免费使用ISAPI_Rewrite精简版产品。

4. Helicon Tech准予免费试用ISAPI_Rewrite产品30天当试用期结束时请要么购买ISAPI_Rewrite要么删除ISAPI_Rewrite产品。

5.未注册过的ISAPI_Rewrite试用版可以在不被改动的前提下自由传播除非有下例情况。任何个人或者公司都不用为在未得版权持有人书面许可的情况下传播ISAPI_Rewrite而付费。未经版权持有者的书面许可未注册的试用版ISAPI_Rewrite不允许捆绑其它安装包。

6. ISAPI_Rewrite必须被原样传播不提供任何形式的保证明示或暗示。你可以在你自己的磁盘上使用ISAPI_Rewrite。作者不为因为滥用本软件导致的数据丢失、损坏或任何其他类型的损失承担责任。

7.你不得使用、复制、模仿、克隆、出租、出售、修改、反编译、反汇编以及其它任何反向工程或者转让许可程序或者任何许可程序的一个子集除非本协议有提供。任何未经授权的使用将导致本许可自动终止。并可能导致刑事或民事起诉。

8.本许可协议的条款是在未来版本的ISAPI_Rewrite将会有所变化。

9.当你购买ISAPI_Rewrite时将发给你“注册码”。这种“注册码”可以个人或者公司购买并只在一台计算机上使用。如果您购买一个以上的ISAPI_Rewrite副本发给你们的“注册码”只能在等于你购买的许可证数的计算机上使用。

10.您只能使用来自Helicom Tech以及与Helicom Tech有业务合作或者技术合作的公司的注册码。

11. 安装和使用ISAPI_Rewrite意味着接受这些条款及许可条件。

12. 如果您不同意本许可证的条款或违反本许可与您当地的法律规定您必须从您的存储设备中删除ISAPI_Rewrite文件并停止使用该产品。

13.我们坚持严格的隐私的准则不会收集个人识别信息除非是自愿提供的。