日期:2017-06-06 浏览次数:27256 次
ISAPI_Rewrite是一个功能强大的基于表达式的URL操纵引擎。它主要类似于Apache的mod_Rewrite,但它特别适用于Microsoft Internet Information Server和Microsoft Security and Acceleration Server 2004.如果您想要更改网站的URL方案,本产品适合您!
ISAPI_Rewrite的一些主要优点:
ISAPI_Rewrite是非常快速和高度可扩展的解决方案。它是使用纯C / C ++代码,Win32 API和ISAPI编写的。它采用智能配置缓存机制。所有工作只在一个阶段完成,没有递归请求或任何其他可能需要很长时间的操作。
ISAPI_Rewrite设计用于在共享环境中运行。它可以像您一样提供许多网站。ISP和主机提供商可以安全地允许用户配置ISAPI_Rewrite,并确保任何配置更改只会影响本地用户的环境。ISAPI_Rewrite甚至可以解决许多安全问题,例如,阻止访问某些文件夹或文件扩展名或创建更复杂的规则。
ISAPI_Rewrite的灵活性和功能来自其正则表达式。使用正则表达式,您不需要编写数千个检查字符串。URL的比较和替换可以用几个字符串模式完成。所以,ISAPI_Rewrite可以做许多事情,使用IIS可用的其他解决方案无法完成。有关详细信息,请参阅示例 部分。
ISAPI_Rewrite提供了基于规则的重写引擎来即时重写请求的URL。它支持几乎无限数量的规则和无限数量的附加规则条件,以提供一个非常灵活和强大的URL操纵机制(真的配置文件大小被强制限制在2Mb以防止可能的配置解析开销)。URL操作可以取决于HTTP头,服务器变量,Request-URI,客户端请求的方法和版本信息的测试。
在大多数情况下,ISAPI_Rewrite用于重写Request-URI(在RFC 2616中定义)和常见的HTTP请求标头。例如,如果客户端请求资源为http://www.somesite.com /path/file.ext?parameter=value,则 ISAPI_Rewrite将在标记为红色的部分进行操作。此外,ISAPI_Rewrite可以重写,创建或删除请求的任何其他HTTP头。程序操作可能导致对服务器的原始请求的重写,代理,重定向或阻塞。
重写引擎通过规则(RewriteRule和RewriteHeader 指令)执行规则集规则。特定规则仅在匹配Request-URI和所有相应条件(RewriteCond伪指令)匹配其测试字符串(头或服务器值))时才应用。 ISAPI_Rewrite使用MATCH 算法。这意味着测试字符串不会搜索规则模式,但是整个测试字符串与模式匹配。例如,模式a * b将不匹配字符串aaaaaaaabbbbbbbb。
成功的规则应用程序的结果保存在原始标题中,并且对于所有后续规则将可见。当最后一个规则(重定向,代理,禁止或由L标记标记的规则)匹配时,规则处理将停止。
重写将导致服务器继续使用新URI的请求处理,就像它最初是由客户端请求一样。新URI可以包括查询字符串部分(以下问号),并且可以指向任何普通文件(如图像),脚本(如ASP),程序(如EXE)等。
Proxiing会导致生成的URI被内部处理为另一个服务器上的目标,并立即(即规则处理在此停止)传递到处理代理请求的ISAPI扩展。您必须确保生成的字符串是一个有效的URL,包括协议,主机等。否则您将从代理获取错误。
重定向将导致立即响应发送具有作为新位置的结果URI的重定向指令(HTTP响应代码302或301)。您可以在重定向指令中使用绝对URL(这是RFC 2616所要求的),将请求重定向到不同的主机,端口和协议。重定向指令总是导致重写引擎停止规则序列处理。
规则按照配置文件中出现的顺序进行处理。ISAPI_Rewrite首先应用服务器范围(全局)规则。然后它应用特定于处理请求的IIS网站的规则(如果存在站点级规则)。处理顺序中没有递归请求或后续回滚(除了显式生成的循环)。因此,请求处理永远不会陷入无限循环。
在任何URI修改之前,ISAPI_Rewrite将原始的Request-URI保存到名为X-Rewrite-URL的HTTP头中。然后它可以使用Request.ServerVariables(“HTTP_X_REWRITE_URL”)别名在ASP中检索。
多个RewateCond指令后跟一个RewriteRule(或RewriteProxy)指令仅影响RewriteRule。所以,这些条件应被视为复杂规则的一部分。
每当您将复数规则(具有条件的规则)中的任何正则表达式放在括号中时,您将标记可以使用格式字符串(使用$ N语法)或作为反向引用(使用\ N语法)的子配对,在随后的条件下。这些子功能对于整个复杂规则(RewriteRule指令和相应的RewriteCond 指令)是全局的 。从第一个RewriteCond指令(如果这样的指令存在)对应于RewriteRule,子匹配从上到下,从左到右编号。
为了简化规则并加强服务器安全性,强烈建议在IIS设置中禁用父路径。
常见的ISAPI_Rewrite安装过程包括以下步骤:
可以自动或手动安装ISAPI_Rewrite模块。
通常通过运行其中一个安装包并遵循向导说明来安装ISAPI_Rewrite。安装程序会自动复制ISAPI_Rewrite文件并注册COM对象,ISAPI筛选器和ISAPI扩展。
要在Windows Vista上安装ISAPI_Rewrite,您需要在ISAPI_Rewrite安装之前安装以下可选的IIS组件(使用添加/删除程序小程序 - >系统组件):
只有完整版本的ISAPI_Rewrite支持手动安装。您将需要下载包含所有必需文件的不同手动安装包。您可以安装所有功能或仅部分功能。
可以安装以下选项:
在NT4,Windows 2000,Windows XP和Windows Server 2003上,使用IIS MMC管理单元将ISAPI_Rewrite.dll添加到ISAPI筛选器列表,仅针对整个IIS服务器或特定网站。
在Windows Vista上首先安装可选的IIS组件:
然后使用IIS MMC管理单元将ISAPI_Rewrite.dll添加到ISAPI过滤器功能,全局或特定网站仅。
从安装文件夹发出以下命令:
regsvr32 mtbnotif.dll。
从安装文件夹 启动regmsg.vbs脚本。
Lite和Full版本的ISAPI_Rewrite共享相同的重写引擎和源代码。但Lite版本不支持每个站点配置和所有相关功能。只处理全局规则。此外,Lite版本不包括代理引擎。Lite版本不支持以下指令:RewriteProxy,EnableRewrite,DisableRewrite,EnableConfig,DisableConfig,CacheClockRate。Lite版本不支持以下标志:P - proxy。
ISA Server 2004的ISAPI_Rewrite基于ISAPI_Rewrite的Lite版本。那么它与Lite版本有相同的限制(这是由于ISA架构,它不支持其他完整版本功能所需的ISAPI的子集)。 请注意,如果服务器阵列中有多个ISA Server,则必须在所有阵列成员上安装ISA 2004的ISAPI_Rewrite。
这些特别说明涉及Internet Information Server 6.0(内置到Windows 2003 Server中)的新功能以及这些功能对ISAPI_Rewrite功能的限制。
IIS6与其祖先的主要区别是称为工作进程隔离(WPI)模式的新过程模型。虽然IIS6可以在IIS5兼容模式下运行(这对ISAPI_Rewrite的功能没有影响),但其主要优点只能在WPI模式下实现。
在WPI模式中,虚拟网站甚至单个Web应用程序都在应用程序池中运行。并且每个应用程序池由一个或多个隔离的工作进程w3wp.exe提供。它看起来像IIS5中的高隔离模式,但存在一个显着差异。过滤器不再在inetinfo.exe进程内运行。它们正如通常的应用程序在工作进程中运行。
这意味着可以有单个过滤器的多个实例(每个工作进程的一个实例)。不过这不是ISAPI_Rewrite的问题。但是,如果两个Web应用程序http:// mysite / app1和http:// mysite / app2在不同的应用程序池中运行,而不是将/ app1的URL重写到/ app2将被禁止,尽管这两个应用程序属于到同一个网站http:// mysite。在这种情况下,只能使用重定向或代理。然而,通常这种限制对ISAPI_Rewrite的使用没有任何重大影响,因为在大多数情况下,整个网站包含单个应用程序池提供的单个Web应用程序。
RFStyle新功能指示。
在Windows NT4,Windows 2000,Windows XP和Windows 2003中,IIS5兼容模式过滤器在系统帐户下的inetinfo.exe进程中运行。因此,应至少给予系统帐户至少读取所有ISAPI_Rewrite dll,ISAPI_Rewrite.lic文件和所有httpd.ini文件的访问权限。我们还建议给包含httpd.ini文件的所有文件夹授予系统帐户修改权限。这将允许创建包含配置文件解析错误的httpd.parse.errors文件。代理模块可能需要其他权限。因为它可以在池或高隔离应用程序模式下运行,所以IIS共享池和高隔离池的帐户应该被赋予rwhelper.dll和ISAPI_Rewrite.lic文件的读取权限。此外,这些帐户应该被授予对系统临时文件夹(通常为C:\ Windows \ Temp)的修改权限。默认情况下,IWAM_ <ComputerName>用于所有池。在COM +管理MMC管理单元的帮助下,可以在相应的COM +应用程序设置中找到池帐户。
在Windows 2003的本机IIS模式(WPI模式)中,过滤器和代理在w3wp.exe工作进程中运行,对应于托管特定Web应用程序的应用程序池。每个应用程序池都可以配置为使用自己的身份。这可能会将权限配置变成一个棘手的任务。但是在正确的IIS配置中,每个使用的身份应该是IIS_WPG组的成员。因此,IIS_WPG组可以用于分配所需的权限。至少应该向所有ISAPI_Rewrite dlls,rwhelper.dll.manifest,ISAPI_Rewrite.lic和所有httpd.ini文件提供读取权限。另外如果代理将被使用IIS_WPG应该给予系统临时文件夹(通常是C:\ Windows \ Temp)的修改权限。
Vista权限配置与Windows 2003配置几乎相同,只是没有IIS_WPG组。所以,所有WPI帐户(通常是NETWORK SERVICE是唯一的这样的帐户)应该被赋予所需的权限。
有时代理模块可能需要手动配置(如果您在代理时看到404错误,那么可能是这里描述的情况)。发生在ScriptMap元数据库属性的继承链被破坏时(这是通常在手动更改网站配置时发生的通常情况)。在这种情况下,代理工作所需的脚本映射应该手动填充。ISAPI_Rewrite安装文件夹中有一个名为cscript.vbs的WSH脚本,可用于通过配置数据库填充代理脚本映射。阅读配置实用程序部分,了解脚本使用情况。
有两种类型的配置文件 - 全局(服务器级)和单个(站点级)文件。全局配置文件应命名为httpd.ini,并应出现在ISAPI_Rewrite安装目录中。该文件的快捷方式通过开始菜单提供。单个配置文件应命名为httpd.ini ,并可能出现在虚拟站点的物理根目录中。所有配置文件格式相同。它是一个标准的Windows INI文件的格式,其中的设置被细分。ISAPI_Rewrite版本允许的唯一部分是[ISAPI_Rewrite]。所有指令应放在本节中,每个指令应放在单独的一行。本部分以外的任何文本都将被忽略。
httpd.ini文件示例:
[下ISAPI_Rewrite] #这是一个评论 #300 = 5分钟 CacheClockRate 300 RepeatLimit 20 #阻止对httpd.ini和httpd.parse.errors文件的外部访问 RewriteRule /httpd(?:\.ini|\.parse\.errors)/ [F,I,O] #阻止对Helper ISAPI扩展的外部访问 RewriteRule。* \。isrwhlp / [F,I,O] #一些自定义规则 RewriteCond主机:(。+) RewriteRule(。*)/ $ 1 $ 2 [I] |
当ISAPI_Rewrite解析配置文件时,会在解析文件所在的同一目录中创建一个名为httpd.parse.error的错误日志文件。解析期间只能检测到明显的语法错误。复杂的语法错误和逻辑错误只能在规则执行过程中找到。所以他们不会登录到httpd.ini。在将规则放入配置文件之前,建议使用正则表达式测试工具检查新规则。
语法:UriMatchPrefix PrefixString |
所述UriMatchPrefix指令定义将被预置到一个字符串TestVerb一切都随后的重写规则,RewriteProxy, 的RewriteCond URL和RewriteHeader URL 指令(即,在所有URI测试条件)。该指令是Apache的RewriteBase指令的部分模拟。UriMatchPrefix的默认值为空字符串。
语法:UriFormatPrefix PrefixString |
该UriFormatPrefix指令定义将被预置到一个字符串formatString的所有后续第重写规则和RewriteHeader URL指令(即所有的URI格式字符串)。UriFormatPrefix的默认值为空字符串。
语法:RewriteCond TestVerb CondPattern [Flags] |
该的RewriteCond指令定义了一个规则的条件。先于重写规则 或RewriteHeader或RewriteProxy指令与一个或一个以上的RewriteCond 指令。条件仅影响下一个紧跟规则(RewriteRule,RewriteHeader或RewriteProxy)。因此,他们有效地遵守这一规则。 只有当条件匹配测试字符串并且其所有绑定条件将匹配测试字符串时,才会应用具有条件的规则。
指定与正则表达式匹配的动词。
TestVerb =(URL | METHOD | VERSION | HTTPHeaderName:|%ServerVariable)其中:
有关HTTP标头及其值的更多信息,请参阅RFC 2068。
HTTPHeaderName = 接受: 接收字符集: 接受编码: 接受语言: 授权: 曲奇饼: 从: 主办: 如果-Modified-Since的: 如果-比赛: 如果 - 无 - 匹配: 如果-范围: 如果未修饰的,因为: 马克斯 - 前锋: 代理授权: 范围: 引用站点: 用户代理: 任何 - 自定义标头: |
ServerVariable - 返回指定服务器变量的值。例如,SERVER_PORT。服务器变量的完整列表可以在IIS文档中找到。变量名称应以%符号为前缀。请注意,服务器变量名称区分大小写。因此,例如使用%https而不是%HTTPS将始终会导致一个空值。
匹配TestVerb的正则表达式。
标志是以下标记的逗号分隔列表:
在处理之前规范化字符串。归一化包括删除URL编码,非法字符等。此外,URI的归一化完全删除了查询字符串。因此,如果需要查询字符串,则不应使用规范化。此标志可能对URL和URL编码的标题很有用。
内部所有具有条件的规则的正则表达式都被加入到一种单一的正则表达式中:
(?:Condition1RegExp)\ n(?:Condition2RegExp)\ n ... \ n(?:ruleRegExp)
然后,这个单个表达式与组合标题的文本字符串进行匹配。缺少标题和变量被认为是空字符串。因为特殊字符^和$对应于组合的文本字符串(而不是单个标题字符串的开头和结尾)的开始和结束,所以在具有条件的规则中使用它们可能导致与预期的完全不同的行为一。所以,强烈建议避免在具有条件的规则中使用^和$标记。
语法:RewriteRule Pattern FormatString [Flags] |
该重写规则指令是真正的重写主力。该指令可能会发生不止一次。每个指令定义一个单独的重写规则。 这些规则的定义顺序很重要,因为在运行时应用规则时会使用此顺序。
指定将与Request-URI匹配的正则表达式。有关更多信息,请参阅正则表达式语法部分。
指定将生成新URI的格式字符串。有关详细信息,请参阅格式字符串语法部分。
标志是以下标记的逗号分隔列表:
表示字符匹配,无论情况如何。该标志影响RewriteRule指令和所有相应的RewriteCond 指令。
停止重写过程,并向客户端发送404 Not Found响应(不是403禁止!而且这种行为对应于IIS 6行为)。请注意,FormatString在这种情况下是无用的,可以设置为任何非空字符串。
在此停止重写过程,不再应用任何重写规则。使用此标志可防止当前重写的URI通过以下规则进一步重写。
强制重写引擎修改规则的目标,并从头开始重新启动规则检查(所有的修改都被保存)。重启次数受到RepeatLimit指令中指定的值的限制。如果超过此数值,N标志将被忽略。
像N标志一样工作,但是从相同的规则重新启动规则处理(即强制执行规则应用程序的重复)。单次规则迭代的最大数量由RepeatLimit指令给出。但是,大量的单个规则重复不对全局重复次数计算(即,由N个标志引起的重复次数的重复限制与由NS引起的重复次数无关)。
将结果URI强制为内部强制作为代理请求,并立即通过处理代理请求的ISAPI扩展(即重写规则处理停止在此处)。您必须确保替换字符串是一个有效的URI,包括协议,主机等或代理将返回一个错误。
强制服务器通过重定向指令立即向客户端发送响应,将结果URI作为新位置。重定向规则始终是最后一条规则。
与[R]标志几乎相同,但是问题301(永久移动)HTTP状态代码而不是302(暂时移动)。
Log the URL as it was originally requested and not as the URL was rewritten.
Normalizes string before processing. Normalization includes removing of an URL-encoding, illegal characters, etc. Also, IIS normalization of an URI completely removes query string. So, normalization should not be used if query string is needed. This flag is useful with URLs and URL-encoded headers.
Changes case of a format result to lower.
Changes case of a format result to upper.
Syntax: RewriteHeader HeaderName Pattern FormatString [Flags] |
The RewriteHeader directive is more general variant of RewriteRule directive and it is designed to rewrite not only the URL part of client request, but any HTTP header. This directive can be used to rewrite, create or delete any HTTP headers, or even change method of the client request.
Specifies a HTTP header that will be rewritten. Possible values are the same as for the TestVerb parameter in the RewriteCond directive. Thus, RewriteRule directive is a synonym to the RewriteHeader URL Pattern Format [Flags]
指定将与指定标头匹配的正则表达式。有关更多信息,请参阅正则表达式语法部分。
指定将生成新标头值的格式字符串。有关详细信息,请参阅格式字符串语法部分。
标志是以下标记的逗号分隔列表:
表示字符匹配,无论情况如何。此标志影响RewriteHeader指令和所有相应的RewriteCond 伪指令。
停止重写过程,并向客户端发送404 Not Found响应(不是403禁止!而且这种行为对应于IIS 6行为)。请注意,FormatString在这种情况下是无用的,可以设置为任何非空字符串。
在此停止重写过程,不再应用任何重写规则。
强制重写引擎修改规则的目标,并从头开始重新启动规则检查(所有的修改都被保存)。重启次数受到RepeatLimit指令中指定的值的限制。如果超过此数值,N标志将被忽略。
像N标志一样工作,但是从相同的规则重新启动规则处理(即强制执行规则应用程序的重复)。单次规则迭代的最大数量由RepeatLimit指令给出。但是,大量的单个规则重复不对全局重复次数计算(即,由N个标志引起的重复次数的重复限制与由NS引起的重复次数无关)。
强制服务器通过重定向指令立即向客户端发送响应,提供新的URI作为新位置。重定向规则始终是最后一条规则。
与[R]标志几乎相同,但是问题301(永久移动)HTTP状态代码而不是302(暂时移动)。
按照原始请求记录网址,而不是重写URL。
在处理之前规范化字符串。归一化包括删除URL编码,非法字符等。此外,URI的归一化完全删除了查询字符串。因此,如果需要查询字符串,则不应使用规范化。此标志对URL和URL编码的标题很有用。
更改格式的情况下降。
将格式的大小写更改为上限。
要删除标题,格式字符串模式应该生成一个空字符串。例如,此规则将从客户端请求中删除用户代理信息:
RewriteHeader User-Agent:。* $ 1 |
而这个规则会将Old-URL标头添加到请求中,提供一个Request-URL作为头值:
RewriteCond URL(。*) RewriteHeader Old-URL:^ $ $ 1 |
最后一个例子将通过更改请求方法将所有WebDAV请求引导到/webdav.asp脚本:
RewriteCond方法选项 RewriteRule(。*)/webdav.asp? $1 RewriteHeader方法选项GET |
语法:RewriteProxy 模式FormatString [Flags] |
将结果URI强制为内部强制作为代理请求,并立即通过处理代理请求的ISAPI扩展(即重写规则处理停止在此处)。这样IIS可以充当代理服务器,并将请求重新路由到其他站点和服务器。
指定将与Request-URI匹配的正则表达式。有关更多信息,请参阅正则表达式语法部分。
指定将生成新URI的格式字符串。有关详细信息,请参阅格式字符串语法部分。对于此指令,FormatString应生成有效的URL(包括协议,主机等)或ISAPI_Rewrite代理模块将返回错误。
标志是以下标记的逗号分隔列表:
代理模块将尝试使用当前模拟用户的凭据登录远程服务器。在内置IIS身份验证的情况下,它将是发送原始请求的用户的凭据。有关详细信息,请阅读以下章节。
代理模块将尝试使用URL或基本身份验证头中指定的凭据登录远程服务器。使用此标志,您可以使用URL的http:// user:password@host.com/path/语法。有关详细信息,请阅读以下章节。
默认情况下,ISAPI_Rewrite将尝试将远程服务器返回的重定向指令(301,302等)映射到本地服务器命名空间中。如果远程服务器返回指向该服务器某处位置的重定向,则ISAPI_Rewrite将修改此重定向指令以指向本地服务器名称。这将隐藏用户的真实(内部)服务器名称。
F标志可用于强制代理模块在内部遵循从远程服务器返回的重定向指令。如果您不需要从远程服务器接收重定向,请使用此标志。谨慎使用这个标志。它可能会破坏一些服务器应用程序。例如,.NET WinForms身份验证在重定向期间设置客户端cookie。如果代理将被指示处理此重定向cookie将丢失,用户将永远不会被认证。
表示字符匹配,无论情况如何。此标志影响RewriteProxy指令和所有相应的RewriteCond 伪指令。
按照原始请求记录网址,而不是重写URL。
在处理之前规范化字符串。归一化包括删除URL编码,非法字符等。此外,URI的归一化完全删除了查询字符串。因此,如果需要查询字符串,则不应使用规范化。此标志对URL和URL编码的标题很有用。
代理模块将使用当前主机头对远程服务器的请求。没有这个标志代理将从主机名和远程服务器的端口组成主机头。
允许在使用代理服务器的客户端认证时将认证信息从代理传递到内部服务器。代理模块将附加标题
X-ISRW-Proxy-AUTH-TYPE, X-ISRW-Proxy-AUTH-USER, X-ISRW-Proxy-LOGON-USER, X-ISRW-Proxy-REMOTE-USER |
AUTH_TYPE, AUTH_USER, LOGON_USER, REMOTE_USER |
IIS架构和代理模块实现对可以与代理一起使用的身份验证方案施加明确的限制。可用的方案描述如下:
语法:CacheClockRate 间隔 |
此指令只能在全局配置上下文中显示。如果在站点级上下文中找到该指令,将忽略该指令,并将错误消息写入httpd.parse.errors文件。
ISAPI_Rewrite在第一次加载时缓存每个配置文件。使用此指令可以指定特定站点的配置从高速缓存清除时的不活动时间段。通过将此参数设置得足够大,可以强制ISAPI_Rewrite从不回收其缓存。请记住,任何对配置文件的更改都会在下次请求后立即更新缓存,无论此间隔如何。
指定从高速缓存清除特定配置时的不活动时间(以秒为单位)。默认值为3600(1小时)。
语法: EnableConfig [ SiteID |“站点名称” ] DisableConfig [ SiteID |“站点名称” ] |
启用或禁用所选站点的站点级配置或更改默认值。默认情况下,启用了站点级配置。此指令只能在全局配置上下文中显示。如果在站点级上下文中找到,将被忽略,并将错误消息写入httpd.parse.errors文件。
网站的数字元数据库标识符
该站点的名称显示在IIS控制台中。
如果不使用参数,则该指令将默认设置转换为启用/禁用配置处理。
例:
以下内容将仅为ID = 1的站点(通常为默认网站)和名为“我的站点”的站点启用配置:
DisableConfig EnableConfig 1 EnableConfig“我的网站” |
在以下示例中,对于名为“某些站点”的站点启用了配置,因为显式设置会覆盖默认设置。
EnableConfig“Some site” DisableConfig |
语法: EnableRewrite [ SiteID |“站点名称” ] DisableRewrite [ SiteID |“站点名称” ] |
启用或禁用所选站点的重写或更改默认值。默认情况下,重写已启用。此指令只能在全局配置上下文中显示。如果在站点级上下文中找到,将被忽略,并将错误消息写入httpd.parse.errors文件。
网站的数字元数据库标识符
该站点的名称显示在IIS控制台中。
语法:RepeatLimit Limit |
此指令可能出现在全局和站点级配置文件中。如果它将出现在全局配置文件中,它将更改所有站点的全局限制。如果此指令将显示在站点级配置文件中,则它将仅更改此站点的限制,并且此限制不能超过全局限制。
ISAPI_Rewrite允许循环处理规则(请参阅RewriteRule和RewriteHeader指令的N标志的说明)。该指令允许限制最大可能的循环数。它可以设置为零或一个以禁用循环。
指定允许循环的最大数量。默认值为32。
语法:RFStyle 旧| 新 |
RFStyle指令允许在完整版ISAPI_Rewrite中控制重定向和禁止响应样式。默认的旧样式是直接从过滤器发出这些响应。该方法很快,不需要额外的配置。但是在这种情况下,IIS无法记录原始请求。 新风格力量过滤通过代理模块发出重定向和禁止的响应。这种技术可以记录重定向和禁止的请求。但是这种方法在许多情况下需要手动配置。代理模块配置的详细信息可以在下一章中找到。
ISAPI_Rewrite Full包含配置实用程序(可以从ISAPI_Rewrite程序组启动)。它允许您查看试用状态并输入注册码(如果产品在安装期间未注册),并修改与代理模块操作相关的一些产品选项。实用程序被组织为具有三个属性页的属性表:
只有在试用模式下安装了ISAPI_Rewrite,才会显示此页面。它允许您查看产品的试用状态并输入注册码。
此页面包含以下参数的编辑框和复选框:
此参数影响过滤器和代理模块之间的通信方式。这可以是以点(如.isrwhlp)或绝对URI(如/isrwhlp/rwhelper.dll)为前缀的文件扩展名。
在第一种情况下,扩展名将附加到原始请求URI,代理模块将通过脚本映射进行调用。默认扩展名“.isrwhlp”在安装过程中被添加到全局脚本映射。如果您更改了此扩展名,或者您的应用程序不继承全局脚本映射设置,则应手动将脚本映射添加到所需条目。它应该有以下参数:
可执行文件: | 一个绝对路径的rwhelper.dll的简短形式 |
延期: | 所需扩展名(.isrwhlp为默认值) |
动词单选按钮: | 所有动词 |
脚本引擎复选框: | 经过 |
检查该文件是否存在复选框: | 未选中 |
我们创建了一个WSH脚本proxycfg.vbs,可以在脚本映射中简化辅助扩展注册。它位于ISAPI_Rewrite安装文件夹中,可以通过以下方式从命令行运行:
cscript proxycfg.vbs [-r] [MetabasePath] |
要在所有现有脚本映射中注册扩展名,您可以使用以下命令字符串调用脚本:
cscript proxycfg.vbs -r |
在第二种情况(绝对URI)中,您应该为“Helper URL”的值提供一个像/vfolder/rwhelper.dll这样的URI。您还应将ISAPI_Rewrite的安装文件夹映射为所选的虚拟文件夹(/ vfolder)到每个将使用代理并启用这些虚拟文件夹的可执行文件的站点。
注意:正如我们的客户报告的那样,IIS 5(可能是IIS 4)在Helper URL中存在长目录名称的问题。所以强烈建议使用短目录名。
两种方法都有优缺点。第二个允许您将代理应用程序与其他应用程序隔离开,但此方法可能会在IIS6下失败。第一个应该在IIS6下正常工作,但代理模块将在原始请求URL所针对的应用程序的上下文中被调用。
此参数限制代理扩展线程池中的最大工作线程数。默认值0表示此限制将等于处理器数乘以2。
此参数限制并发运行的工作线程的最大数量。此值不能大于“工作线程限制”。默认值0表示此限制将等于处理器数量。
该参数定义了可以排队等待代理模块的单个实例进行处理的最大请求数。如果您在应用程序事件日志中看到“Queue timeout expired”消息,可以增加此参数。
此参数定义将新请求放入内部请求队列的最大等待时间。当队列请求数量达到“Queue size”参数定义的最大值时,它变为实际。如果您在应用程序事件日志中看到“Queue timeout expired”消息,可以增加此参数。
指定代理模块的连接超时(以毫秒为单位)。默认值为60000(60秒)。
指定代理模块的发送超时(以毫秒为单位)。默认值为30000(30秒)。
指定代理模块的接收超时(以毫秒为单位)。默认值为30000(30秒)。
指定代理模块不应该向客户端发送详细的错误消息。默认值为true。
它包含版权信息和指向ISAPI_Rewrite网站的链接。
本节给出了ISAPI_Rewrite使用的正则表达式语法的简要说明。可以在Boost.Regex文档中找到完整的语法 描述。
所有字符都是文字,除了“。”,“*”,“?”,“+”,“(”,“)”,“{”,“}”,“[”,“] “$”。这些字符是前面加上“\”的文字。文字是一个匹配自己的角色。
点字符“。” 匹配任何单个字符,除了空字符和换行符。
重复是重复任意次数的表达式。后面跟着“*”的表达可以重复任意次数,包括零。后面跟着“+”的表达可以重复任意次数,但至少要重复一次。一个表达后跟“?” 可能仅重复零次或一次。当需要明确指定重复的最小和最大数量时,可以使用边界运算符“{}”,因此“a {2}”是重复两次的字母“a”,“a {2,4} “代表重复2到4次之间的字母”a“,”a {2,}“表示重复至少两次而没有上限的字母”a“。请注意,{}中不能有空格,下限和上限值无上限。所有重复表达式都指最短的以前的子表达式:单个字符; 一个字符集,或者一个与“()”分组的子表达式)。
例子:
非贪心重复可以通过附加一个'?' 经过重复; 不贪婪的重复是匹配最短字符串的重复。
例如,为了匹配html标签对,可以使用以下内容:
“<\ S *标记名[^>] *>(。*?)<\ S * /标记名\ S *>”
在这种情况下,$ 1将包含标签对之间的文本,并且将是最短的匹配字符串。
括号用于两个目的,将项目组合成子表达式,并标记生成的匹配项。例如,表达式“(ab)*”将匹配所有的字符串“ababab”。可以使用\ N或$ N语法返回引用括号中标记的所有子匹配。子表达式允许匹配空字符串。子表达式从左到右索引,从1开始,子表达式0是整个表达式。
有时您需要使用括号对子表达式进行分组,但是不希望括号中吐出另一个标记的子表达式,在这种情况下可以使用非标记括号(?:expression)。例如,以下表达式不创建子表达式:
“(?:ABC)*”
当表达式可以匹配一个子表达式或另一个子表达式时,会发生替代,每个替换由“|”分隔。每个替代方案是以前最大的子表达式; 这是与重复运算符相反的行为。
例子:
一组是一组可以匹配组中成员的单个字符的字符。集合由“[”和“]”分隔,并且可以包含文字,字符范围,字符类,整理元素和等价类。设置以“^”开头的声明包含以下元素的补充。
例子:
字符文字:
角色范围:
字符类在集合声明中使用语法“[:classname:]”表示,例如“[[:space:]]”是所有空格字符的集合。可用的字符类是:
alnum | 任何字母数字字符。 |
α | 任何字母字母az和AZ。其他字符也可能包括在内。 |
空白 | 任何空白字符,空格或制表符。 |
CNTRL | 任何控制字符。 |
数字 | 任意数字0-9。 |
图形 | 任何图形字符。 |
降低 | 任何小写字母az。其他字符也可能包括在内。 |
打印 | 任何可打印字符。 |
PUNCT | 任何标点符号。 |
空间 | 任何空格字符。 |
上 | 任何大写字母AZ。其他字符也可能包括在内。 |
xdigit | 任何十六进制数字字符,0-9,af和AF。 |
字 | 任何字词 - 所有字母数字字符加下划线。 |
统一 | 任何代码大于255的字符,这仅适用于宽字符traits类。 |
有一些捷径可以用来代替字符类:
整理元素在集合声明中采用通用形式[.tagname。],其中标记名是单个字符或整理元素的名称,例如[[.a。]]等效于[a],[ [.comma。]]等同于[,]。ISAPI_Rewrite支持所有标准的POSIX整理元素名称,另外还有以下几何图形:“ae”,“ch”,“ll”,“ss”,“nj”,“dz”,“lj”和标题案例变化。多字符整理元素可以使集合匹配多于一个字符,例如[[.ae。]]将匹配两个字符,但请注意[^ [.e.]]只匹配一个字符。
等价类在集合声明中采用通用形式[= tagname =],其中tagname是单个字符或整理元素的名称,并且匹配任何与整理元素相同的主等价类的成员的字符[.tagname。]。等价类是一组整理相同的字符,主等价类是一组主要排序键全部相同的字符(例如,字符串通常由字符整理,然后通过重音,然后按字母顺序排列;主要分类关键字与字符相关,次要是重音,大写与大写相关)。如果没有对应于标记名的等价类,
在集合声明中包含一个文字“ - ”,然后:将其作为开头之后的第一个字符“[”或“[^”,范围的端点,整理元素,或者在其前面带有转义字符,如“ [\ - ]”。要在一个集合中包含一个文字“[”或“]”或“^”,然后使它们成为一个范围的终点,一个整理元素或一个转义字符的前缀。
一个锚点是匹配一行的开始或结尾处的空字符串:“^”与一行起始处的空字符串相匹配,“$”与一行末尾的空字符串相匹配。
反向引用是对已经匹配的先前子表达式的引用,引用是与子表达式匹配的,而不是表达式本身。后面的引用由转义字符“\”后跟数字“1”到“9”,“\ 1”是指第一个子表达式“\ 2”到第二个等。例如表达式“( 。*)\ 1“匹配任何关于其中点重复的字符串,例如”abcabc“或”xyzxyz“。对未参与任何匹配的子表达式的后援引用,与空字符串匹配。在ISAPI_Rewrite中,所有后缀引用对于整个RewriteRule和相应的RewriteCond伪指令是全局的。
这有两种形式; 一个是正??面前瞻性的断言,一个是负面的前瞻性断言:
提供了与GNU正则表达式库兼容的以下运算符。
转义字符“\”有几个含义。
以下转义序列是单个字符的别名:
逃生顺序 | 字符代码 | 含义 |
---|---|---|
\一个 | 0×07 | 贝尔人物。 |
\ t | ×09 | 标签字符。 |
符\ v | 0x0B中 | 垂直标签。 |
。\ E | 0x1B | ASCII转义字符 |
\ 0DD | 0DD | 一个八进制字符代码,其中dd是一个或多个八进制数字。 |
\ XXX | 0XXX | 十六进制字符代码,其中XX是一个或多个十六进制数字。 |
\ X {XX} | 0XXX | 十六进制字符代码,其中XX是一个或多个十六进制数字,可选地是unicode字符。 |
\ CZ | Z- @ | ASCII转义序列控制Z,其中Z是大于或等于'@'的字符代码的ASCII字符。 |
主要提供以下内容用于perl兼容性,但请注意,\ l \ L \ u和\ U的含义有一些差异:
逃生顺序 | 含义 |
---|---|
\ W | 相当于[[:word:]]。 |
\ W | 相当于[^ [:word:]]。 |
\ S | 相当于[[:space:]]。 |
\ S | 相当于[^ [:space:]]。 |
\ D | 相当于[[:digit:]]。 |
\ D | 相当于[^ [:digit:]]。 |
\升 | 等效于[[:lower:]]。 |
\大号 | 相当于[^ [:lower:]]。 |
\ü | 相当于[[:upper:]]。 |
带有\ U | 相当于[^ [:upper:]]。 |
\C | 任何单个字符,相当于'。'。 |
\X | 匹配任何Unicode组合字符序列,例如“a \ x 0301”(字母a与急性)。 |
\ Q | 开始报价运算符,以下所有内容都被视为文字字符,直到找到一个\ E结束报价运算符。 |
。\ E | 结束引用操作符终止以\ Q开头的序列。 |
正则表达式将匹配第一个可能的匹配字符串,如果从一个给定位置开始的多个字符串可以匹配,那么它匹配最长可能的字符串。在它们是多个可能匹配的情况下,全部从相同位置开始,并且全部相同的长度,则所选择的匹配是具有最长的第一子表达式的匹配,如果对于两个或更多个匹配是相同的,则第二个子表达式将被检查等等。请注意,ISAPI_Rewrite使用MATCH算法。只有当表达式与整个输入序列匹配时,结果才匹配。例如:
ISAPI_Rewrite使用非常强大的正则表达式引擎Regex ++从Boost库。但是它有一些限制:存在一些可能需要指数时间进行匹配的“病理”表达式。这些都涉及嵌套重复操作符,例如试图匹配的表述“(A * A)* B”相对于N-字母a的需要时间正比于2 Ñ。这些表达式(几乎)总是可以以避免问题的方式重写,例如“(a * a)* b”可以被重写为“a * b”,它只需要与N成正比的时间来解决。在一般情况下,非嵌套重复表达式需要与N 2成比例的时间,
正则表达式++可以检测这种“病态”正则表达式并终止其匹配。这将导致ISAPI_Rewrite的规则失败。当规则失败时,ISAPI_Rewrite向客户端发送“500内部服务器错误 - 规则失败”状态以指示配置错误。
在格式字符串中,除了“(”,“)”,“$”,“\”,“?”,“:”外,所有字符都被视为文字。
要使用这些作为文字中的任何一个,您必须在其前缀与转义字符\
识别以下特殊序列:
使用括号字符(和)对格式字符串中的子表达式进行分组,使用\(和\)表示文字'('和')'。
以下perl表达式扩展为特定的匹配子表达式:
$` | 如果在当前操作中没有先前的匹配,则将从上一个匹配结束的所有文本扩展到当前匹配的开始,然后从输入字符串的开始到匹配的开始的所有内容。 |
$” | 扩展到从匹配结尾到输入字符串末尾的所有文本。 |
$& | 扩展到所有当前的匹配。 |
$ 0 | 扩展到所有当前的匹配。 |
$ N | 扩展到匹配子表达式N的文本 。 |
条件表达式允许根据子表达式参与匹配而选择两种不同的格式字符串:
?Ntrue_expression:false_expression
如果子表达式N参与了匹配,则执行true_expression,否则执行false_expression。
示例:假设我们搜索“(while)|(for)”,则格式字符串“?1WHILE:FOR”将输出匹配的大小写,但大写。
还允许使用以下转义序列:
\一个 | 钟的性格。 |
\F | 表单Feed字符。 |
\ n | 换行符 |
\ r | 回车字符 |
\ t | 标签字符。 |
符\ v | 垂直制表符。 |
\X | 十六进制字符 - 例如\ x0D。 |
\X{} | 一个可能的unicode十六进制字符 - 例如\ x {1A0} |
\ CX | ASCII转义字符x,例如\ c @等效于escape-@。 |
。\ E | ASCII转义字符。 |
\ DD | 一个八进制字符常数,例如\ 10。 |
本文是“ ASP.NET专业搜索引擎优化 ”一书的第3章“引人注目的SE友好URL”的编辑形式 : Cristian Darie和Jaimie Sirovich的SEO开发人员指南。 本文介绍了如何在动态网站中逐步使用静态和关键字访问URL的大多数流行技术。 |
例如,您已注册了两个域名www.site1.com和www.site2.com 。 现在您可以使用单个物理站点创建两个不同的站点。将以下规则添加到您的httpd.ini文件中:
[下ISAPI_Rewrite] #文件夹上缺少斜杠char RewriteCond主机:(。*) RewriteRule([^。?] + [^。?/])http \:// $ 1 $ 2 / [I,R] #Emulate site1 RewriteCond主机:(?:www \。)?site1 \ .com RewriteRule(。*)/ site1 $ 1 [I,L] #Emulate site2 RewriteCond主机:(?:www \。)?site2 \ .com RewriteRule(。*)/ site2 $ 1 [I,L] |
现在只需将您的网站放在/ site1和/ site2 目录中。
或者你可以使用更通用的规则:
[下ISAPI_Rewrite] #文件夹上缺少斜杠char RewriteCond主机:(。*) RewriteRule([^。?] + [^。?/])http \:// $ 1 $ 2 / [I,R] RewriteCond主机:(www \。)?(。+) RewriteRule(。*)/ $ 2 $ 3 |
对于网站的目录名称应该是这样/somesite1.com,/somesite2.info等。
假设您正在开发将部署到实时服务器上的/ livesite /文件夹的网站的规则。但是,在开发机器上,您需要将文件存储在/ development /文件夹中。在这种情况下,您可以使用UriMatchPrefix和UriFormatPrefix指令来最小化一些命名空间更改所需的更改:
[下ISAPI_Rewrite] #用UriMatchPrefix和UriFormatPrefix命名空间 UriMatchPrefix /开发 UriFormatPrefix /开发 #rules正在这里 #我们正在检查/develop/sampleN.htm并格式化为/develop/sampleN.asp RewriteRule /sample1.htm /sample1.asp [I,L] RewriteRule /sample2.htm /sample2.asp [I,L] RewriteRule /sample3.htm /sample3.asp [I,L] #将命名空间重新设置为默认值 UriMatchPrefix UriFormatPrefix |
在部署到实时服务器之前,您需要更改的唯一事项是UriMatchPrefix和UriFormatPrefix的值。
假设您希望 使用http://www.myhost.com/foo.asp/a/A/之类的请求访问http://www.myhost.com/foo.asp?a=A&b=B&c=C上的物理URL b / B / c / C和参数的数量可能会因请求而异。
存在至少两种可能的解决方案。您可以简单地为每个可能数量的参数添加一个单独的规则,或者您可以使用以下示例演示的技术。
[下ISAPI_Rewrite] RewriteRule(。*?\。asp)(\?[^ /] *)?/([^ /] *)/([^ /] *)(。*)$ 1(?2 $ 2& = $ 4 $ 5 [NS,I] |
该规则将从请求URL中提取一个参数,将其附加到请求字符串的末尾,并从头开始重新启动规则处理。所以它将循环,直到所有的参数将被移动到正确的地方(或直到RepeatLimit将被超过)。
此规则还存在许多不同的分隔符。例如,要使用http://www.myhost.com/foo.asp~a~A~b~B~c?C之类的URL,可以执行以下规则:
[下ISAPI_Rewrite] RewriteRule(。*?\。asp)(\?[^?] *)??([^?] *)?([^?] *)(。*)$ 1(?2 $ 2& = $ 4 $ 5 [NS,I] |
假设我们有运行IIS的互联网服务器和运行其他平台的几个公司服务器。这些服务器不能从互联网直接访问,只能从我们的公司网络访问。以下是一个简单的示例,如何使用代理标记将另一个服务器映射到IIS站点的命名空间中:
[下ISAPI_Rewrite] RewriteProxy /mappoint(.+)http \:// sitedomain $ 1 [I,U] |
这个规则可以帮助将/?用户名更改为/ username和/file.html到/file.htm。如果您将站点从UNIX移动到IIS,并继续从搜索引擎和其他外部页面访问旧页面,这将非常有用。
[下ISAPI_Rewrite] #redirecting来更新旧链接 RewriteRule(。*)\。html $ 1.htm RewriteRule /~(.*)http \:// myserver / $ 1 [R] |
许多网站管理员要求解决以下问题:他们希望将所有请求重定向到一个Web服务器到另一个Web服务器。通常会出现这样的问题,当您需要建立一个更新的Web服务器时,它会替代旧的Web服务器。解决方案是在旧的Web服务器上使用ISAPI_Rewrite:
[下ISAPI_Rewrite] #redirecting来更新旧链接 RewriteRule(。+)http \:// newwebserver $ 1 [R] |
有时候有必要为重要的顶级页面提供与浏览器相关的内容,即必须为Internet Explorer提供功能齐全的版本,Lynx浏览器的最小功能版本和平均功能版本所有其他人。
我们必须对HTTP头“User-Agent”采取行动。示例代码执行以下操作:如果HTTP头“User-Agent”包含“MSIE”,则目标foo.htm将重写为foo.IE.htm。如果浏览器是版本1或2的“Lynx”或“Mozilla”,则URL将成为foo.20.htm。其他浏览器接收页面foo.32.html。所有这些都是由以下规则组完成的:
[下ISAPI_Rewrite] RewriteCond User-Agent:。* MSIE。* RewriteRule /foo\.htm /foo.IE.htm [L] RewriteCond User-Agent:(?:Lynx | Mozilla / [12])。* RewriteRule /foo\.htm /foo.20.htm [L] RewriteRule /foo\.htm /foo.32.htm [L] |
robots.txt是搜索引擎用于发现应该或不应编入索引的URL的文件。但是,为具有大量动态内容的大型站点创建此文件是一项非常复杂的任务。你有没有梦想过动态生成的robots.txt?我们来写一下robots.asp脚本:
<%@ Language = JScript EnableSessionState = False%> <% //脚本必须返回纯文本 Response.ContentType = “text / plain的”; / * 在这里放置生成代码 * / %> |
现在,使用单一规则使其成为robots.txt:
[下ISAPI_Rewrite] RewriteRule /robots\.txt /robots.asp |
存储在XML文件中的网站内容。有/XMLProcess.asp文件处理服务器上的XML文件,并将HTML返回给最终用户。文档的URL具有以下形式:
http
: //www.mysite.com/XMLProcess.asp?xml=/somdir/somedoc.xml 但是许多流行的搜索引擎将不会对这些文档进行索引,因为URL包含问号(文档是动态的生成)。ISAPI_Rewrite可以竞争消除这个问题。
[下ISAPI_Rewrite] RewriteRule /doc(.*)\.htm /XMLProcess.asp\?xml=$1.xml |
现在访问文档使用URL,如http://www.mysite.com/doc/somedir/somedoc.htm。搜索引擎永远都不会知道物理上没有somedoc.htm文件,内容是动态生成的。
有时,当某些模式不匹配时,您需要应用规则。在这种情况下,您可以在正则表达式中使用所谓的Forward Lookahead Asserts。
例如,您需要将所有不使用Internet Explorer的用户移动到其他位置:
[下ISAPI_Rewrite] #重定向所有非Internet Explorer用户 #到另一个位置 RewriteCond User-Agent:(?!。* MSIE)。* RewriteRule(。*)/ nonie $ 1 |
例如,我们在网站上有一些成员区域,我们需要这个区域的密码保护文件,但是我们不喜欢使用内置的服务器安全性。在这种情况下,可以创建ASP脚本(称为proxy.asp),将代理对成员区域的所有请求,并检查所需的权限。以下是此页面的简单模板,您可以在其中放置自己的授权码:
<%@ Language = JScript EnableSessionState = False%> <% 功能Authorize() { //检查用户是否有权在此查看资源 //如果用户具有必需的权限,则返回true,否则返回false 返回真 } 如果(!授权()) { //重定向到登录页面 的Response.Redirect( “http://mysite.com/LoginPage.asp?ref=” + Request.QueryString.Item); 到Response.End() } var WinHttpReq = new ActiveXObject(“WinHttp.WinHttpRequest.5”); WinHttpReq.Open(Request.ServerVariables(“REQUEST_METHOD”)。Item,Request.QueryString.Item,true); var headers = String(Request.ServerVariables(“ALL_RAW”))。split(“\ n”); for(i = 0; i <headers.length && headers [i]; i ++) { header = headers [i] .match(/([\ w - \。] +):\ s *([\ S] *)/); 如果(标题) WinHttpReq.SetRequestHeader(标题[1],标题[2]); } if(lngCount = Request.TotalBytes) { var data = Request.BinaryRead(lngCount); WinHttpReq.Send(数据); } else { WinHttpReq.Send(); } 如果(!WinHttpReq.WaitForResponse(15)) { WinHttpReq.Abort(); Response.Status =“408请求超时”; } else { Response.Status =“”+ WinHttpReq.Status +“”+ WinHttpReq.StatusText; 标题=字符串(WinHttpReq.GetAllResponseHeaders())分割( “\ n”); for(i = 0; i <headers.length && headers [i]; i ++) { header = headers [i] .match(/([\ w - \。] +):\ s *([\ S] *)/); 如果(标题) Response.AddHeader(标题[1],标题[2]); } 回复于(WinHttpReq.ResponseText); } %> |
现在我们需要通过该页面将ISAPI_Rewrite配置为代理请求:
[下ISAPI_Rewrite] #通过proxy.asp代理所有请求 RewriteRule /members(.+)/proxy.asp\?http://www.mysite.com/members$1 |
假设我们在http://www.mysite.com/下有一些内置GIF图形的 页面。这些图形很好,所以其他图形直接通过超链接将它们整合到页面中。我们不喜欢这种做法,因为它给我们的服务器增加了无用的流量。
尽管我们无法100%保护图像不被包含,但我们至少可以限制浏览器发送HTTP Referer标头的情况。
[下ISAPI_Rewrite] RewriteCond主机:(。+) RewriteCond Referer:(?!http:// \ 1. *)。* RewriteRule。* \。(?: gif | jpg | png)/block.gif [I,O] |
RXTest实用程序可用于模拟规则执行。以下示例说明其用法。
一个简单的规则:
RewriteRule(。+)http \:// newwebserver $ 1 [I,R] |
(+)
HTTP \:// newwebserver $ 1
具有条件的规则:
RewriteCond主机:(?!www \。)(。+) RewriteRule(。+)http \://www.$1$2 [I,RP] |
(?!万维网\。)(。+)!(+)
HTTP \://www.$1$2
迭代规则:
RewriteRule(。*?\。asp)(\?[^ /] *)?/([^ /] *)/([^ /] *)(。*)$ 1(?2 $ 2& = $ 4 $ 5 [NS,I] |