日期:2017-06-06  浏览次数:26073 次

简介
功能历史
主要概念
安装
已知的限制和问题
组态
正则表达式语法
格式字符串语法
示例

介绍

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头。程序操作可能导致对服务器的原始请求的重写,代理,重定向或阻塞。

重写引擎通过规则(RewriteRuleRewriteHeader 指令)执行规则集规则。特定规则仅在匹配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安装过程包括以下步骤:

  1. ISAPI_Rewrite模块的安装和注册。此步骤如下所述。
  2. 借助ISRWConfig实用程序进行产品注册。
  3. 文件系统权限调整。这里介绍运行ISAPI_Rewrite所需的权限 。 如果ISAPI_Rewrite模块(这些不包括ini文件)的权限被更改,您可能需要重新启动IIS(例如使用iisreset命令)。

 

可以自动或手动安装ISAPI_Rewrite模块。

自动安装

通常通过运行其中一个安装包并遵循向导说明来安装ISAPI_Rewrite。安装程序会自动复制ISAPI_Rewrite文件并注册COM对象,ISAPI筛选器和ISAPI扩展。

要在Windows Vista上安装ISAPI_Rewrite,您需要在ISAPI_Rewrite安装之前安装以下可选的IIS组件(使用添加/删除程序小程序 - >系统组件):

  • Web管理工具\ IIS 6管理兼容性\ IIS6 WMI兼容性
  • Web管理工具\ IIS 6管理兼容性\ IIS元数据库和IIS6配置兼容性
  • 万维网服务\应用程序开发功能\ ISAPI过滤器
  • 完整版本:万维网服务\应用程序开发功能\ ISAPI扩展

 

手动安装

只有完整版本的ISAPI_Rewrite支持手动安装。您将需要下载包含所有必需文件的不同手动安装包。您可以安装所有功能或仅部分功能。

可以安装以下选项:

  • 过滤器 - 必需组件。过滤手柄重写并将代理请求映射到代理模块。
  • 代理 - 可选组件。代理支持向另一个Web服务器发送请求。此外,需要处理新的重定向和禁止。
  • 配置实用程序 - 可选组件。提供用于产品注册和更改各种代理选项的UI。
  • 正则表达式测试工具 - 可选组件。提供用于规则测试的UI。
  • 配置数据库监视器 - 可选组件。监视网站根文件夹路径的更改,并强制过滤器在路径更改后重新加载每个站点配置。
  • 消息文件 - 可选组件。提供可能会记录到应用程序事件日志中的关键错误的说明。
  • 文档 - 可选组件。包含ISAPI_Rewrite手册。

 

安装顺序

 

  1. 选择存储ISAPI_Rewrite文件的位置(安装文件夹)。例如,C:\ Helicon \ ISAPI_Rewrite“。
  2. 选择要安装的组件。
  3. 将所需文件复制到安装文件夹。每个组件需要的文件有:
    • 过滤器 - ISAPI_Rewrite.dll,httpd.ini
    • 代理 - rwhelper.dll,proxycfg.vbs。而Windows Server 2003和Windows Vista 需要rwhelper.dll.manifest 。如果您正在运行NT4,Windows 2000或Windows XP,请勿复制此文件。
    • 配置实用程序 - ISRWConfig.exe。
    • 正则表达式测试工具 - RXTest.exe。
    • 元数据库监视器 - mtbnotif.dll。
    • 消息文件 - RewriteMsg.dll,regmsg.vbs。
    • 文档 - documentation.htm,logo.gif。
  4. 创建注册表项HKEY_LOCAL_MACHINE \ SOFTWARE \赫利\的ISAPI_Rewrite具有嵌套值INSTALLDIR 类型REG_SZ的和这个值设置为安装文件夹的路径(例如,C:\赫利\的ISAPI_Rewrite \)。
  5. 注册已安装的组件,如下所述(以下未列出的组件不需要任何注册)。
  6. 如果您已经在ISAPI_Rewrite配置实用程序的帮助下使用密钥注册该产品。
  7. 按照ISAPI_Rewrite 运行所需的权限一节所述检查文件系统权限

 

过滤器注册

在NT4,Windows 2000,Windows XP和Windows Server 2003上,使用IIS MMC管理单元将ISAPI_Rewrite.dll添加到ISAPI筛选器列表,仅针对整个IIS服务器或特定网站。

在Windows Vista上首先安装可选的IIS组件:

  1. Web管理工具\ IIS 6管理兼容性\ IIS元数据库和IIS6配置兼容性。
  2. 万维网服务\应用程序开发功能\ ISAPI过滤器

然后使用IIS MMC管理单元将ISAPI_Rewrite.dll添加到ISAPI过滤器功能,全局或特定网站仅。

 

代理注册

  • 在NT4上,没有SP3(或更高版本)的Windows 2000和没有SP1(或更高版本)的Windows XP首先安装WinHTTP 5.1。它可以与SOAP工具包3可在安装 http://download.microsoft.com/download/2/e/0/2e068a11-9ef7-45f5-820f-89573d7c4939/soapsdk.exe
  • 在Windows Vista上首先安装可选的IIS组件万维网服务\应用程序开发功能\ ISAPI扩展
  • 使用以下命令运行代理配置脚本:
    cscript proxycfg.vbs -r
    在64位系统上,确保运行64位cscript,否则您将收到脚本错误
  • 在Windows 2003上,在“ Web服务扩展”列表中为rwhelper.dll创建一条记录(为模块路径指定短(8.3样式)路径名),并将其标记为允许。
  • 在Windows Vista上,在ISAPI和CGI限制功能中为rwhelper.dll(指定模块路径的短(8.3风格)路径名称)创建记录,并将其标记为允许。

元数据表注册

从安装文件夹发出以下命令:
regsvr32 mtbnotif.dll

消息文件注册

从安装文件夹 启动regmsg.vbs脚本。

已知的限制和问题

Lite版本限制

Lite和Full版本的ISAPI_Rewrite共享相同的重写引擎和源代码。但Lite版本不支持每个站点配置和所有相关功能。只处理全局规则。此外,Lite版本不包括代理引擎。Lite版本不支持以下指令:RewriteProxy,EnableRewrite,DisableRewrite,EnableConfig,DisableConfig,CacheClockRate。Lite版本不支持以下标志:P - proxy。

ISA版本细节

ISA Server 2004的ISAPI_Rewrite基于ISAPI_Rewrite的Lite版本。那么它与Lite版本有相同的限制(这是由于ISA架构,它不支持其他完整版本功能所需的ISAPI的子集)。 请注意,如果服务器阵列中有多个ISA Server,则必须在所有阵列成员上安装ISA 2004的ISAPI_Rewrite。

IIS6的特别说明

这些特别说明涉及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应用程序。

已知问题

 

  1. IIS5似乎在从过滤器生成的HTTPS响应中出现问题。这可能会使旧式HTTPS重定向失败。绕过此问题,可以使用新的重定向
    RFStyle新功能
    指示。

 

组态

运行ISAPI_Rewrite所需的权限

在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指令

语法:UriMatchPrefix PrefixString

所述UriMatchPrefix指令定义将被预置到一个字符串TestVerb一切都随后的重写规则RewriteProxy, 的RewriteCond URLRewriteHeader URL 指令(即,在所有URI测试条件)。该指令是Apache的RewriteBase指令的部分模拟。UriMatchPrefix的默认值为空字符串。

UriFormatPrefix指令

语法:UriFormatPrefix PrefixString

UriFormatPrefix指令定义将被预置到一个字符串formatString的所有后续第重写规则RewriteHeader URL指令(即所有的URI格式字符串)。UriFormatPrefix的默认值为空字符串。

RewriteCond指令

语法:RewriteCond TestVerb CondPattern [Flags]

的RewriteCond指令定义了一个规则的条件。先于重写规则 或RewriteHeaderRewriteProxy指令与一个或一个以上的RewriteCond 指令。条件仅影响下一个紧跟规则(RewriteRule,RewriteHeader或RewriteProxy)。因此,他们有效地遵守这一规则。 只有当条件匹配测试字符串并且其所有绑定条件将匹配测试字符串时,才会应用具有条件的规则。

  • TestVerb

    指定与正则表达式匹配的动词。

    TestVerb =(URL | METHOD | VERSION | HTTPHeaderName:|%ServerVariable)其中:

    有关HTTP标头及其值的更多信息,请参阅RFC 2068。

    • URL - 返回客户端请求的Request-URI,如RFC 2068(HTTP 1.1)中所述;
    • 方法 - 返回客户端请求的HTTP方法(OPTIONS,GET,HEAD,POST,PUT,DELETE或TRACE);
    • VERSION - 返回HTTP版本;
    • HTTPHeaderName - 返回指定HTTP头的值。 HTTPHeaderName可以是任何有效的HTTP头名称。标题名称应包括尾部冒号“:”。如果客户端请求中不存在指定的头文件,则  TestVerb将被视为空字符串。
      HTTPHeaderName = 
      接受:
      接收字符集:
      接受编码:
      接受语言:
      授权:
      曲奇饼:
      从:
      主办:
      如果-Modified-Since的:
      如果-比赛:
      如果 - 无 - 匹配:
      如果-范围:
      如果未修饰的,因为:
      马克斯 - 前锋:
      代理授权:
      范围:
      引用站点:
      用户代理:
      任何 - 自定义标头:
    • ServerVariable - 返回指定服务器变量的值。例如,SERVER_PORT。服务器变量的完整列表可以在IIS文档中找到。变量名称应以%符号为前缀。请注意,服务器变量名称区分大小写。因此,例如使用%https而不是%HTTPS将始终会导致一个空值。

  • CondPattern

    匹配TestVerb的正则表达式

  • [标志]

    标志是以下标记的逗号分隔列表:
     

    • O  (n o rmalize)

      在处理之前规范化字符串。归一化包括删除URL编码,非法字符等。此外,URI的归一化完全删除了查询字符串。因此,如果需要查询字符串,则不应使用规范化。此标志可能对URL和URL编码的标题很有用。

技术说明:

内部所有具有条件的规则的正则表达式都被加入到一种单一的正则表达式中:

(?:Condition1RegExp)\ n(?:Condition2RegExp)\ n ... \ n(?:ruleRegExp)

然后,这个单个表达式与组合标题的文本字符串进行匹配。缺少标题和变量被认为是空字符串。因为特殊字符^$对应于组合的文本字符串(而不是单个标题字符串的开头和结尾)的开始和结束,所以在具有条件的规则中使用它们可能导致与预期的完全不同的行为一。所以,强烈建议避免在具有条件的规则中使用^$标记。

RewriteRule指令

语法:RewriteRule Pattern FormatString [Flags]

重写规则指令是真正的重写主力。该指令可能会发生不止一次。每个指令定义一个单独的重写规则。 这些规则的定义顺序重要,因为在运行时应用规则时会使用此顺序。

  • 模式

    指定将与Request-URI匹配的正则表达式。有关更多信息,请参阅正则表达式语法部分。

  • formatString的

    指定将生成新URI的格式字符串。有关详细信息,请参阅格式字符串语法部分。

  • [标志]

    标志是以下标记的逗号分隔列表:

    • 我的情况)

      表示字符匹配,无论情况如何。该标志影响RewriteRule指令和所有相应的RewriteCond 指令。

    • FF orbidden)

      停止重写过程,并向客户端发送404 Not Found响应(不是403禁止!而且这种行为对应于IIS 6行为)。请注意,FormatString在这种情况下是无用的,可以设置为任何非空字符串。

    • Ll ast规则)

      在此停止重写过程,不再应用任何重写规则。使用此标志可防止当前重写的URI通过以下规则进一步重写。

    • NN ext迭代)

      强制重写引擎修改规则的目标,并从头开始重新启动规则检查(所有的修改都被保存)。重启次数受到RepeatLimit指令中指定的值的限制。如果超过此数值,N标志将被忽略。

    • NSÑ所述的EXT迭代小号 AME规则)

      像N标志一样工作,但是从相同的规则重新启动规则处理(即强制执行规则应用程序的重复)。单次规则迭代的最大数量由RepeatLimit指令给出。但是,大量的单个规则重复不对全局重复次数计算(即,由N个标志引起的重复次数的重复限制与由NS引起的重复次数无关)。

    • P(力p乐声)

      将结果URI强制为内部强制作为代理请求,并立即通过处理代理请求的ISAPI扩展(即重写规则处理停止在此处)。您必须确保替换字符串是一个有效的URI,包括协议,主机等或代理将返回一个错误。

    • R(显式r edirect)

      强制服务器通过重定向指令立即向客户端发送响应,将结果URI作为新位置。重定向规则始终是最后一条规则。

    • RP(永久重定向)

      与[R]标志几乎相同,但是问题301(永久移动)HTTP状态代码而不是302(暂时移动)。

    • U (Unmangle Log)

      Log the URL as it was originally requested and not as the URL was rewritten.

    • O (nOrmalize)

      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.

    • CL (Case Lower)

      Changes case of a format result to lower.

    • CU (Case Upper)

      Changes case of a format result to upper.

RewriteHeader directive

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.

  • HeaderName 

    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]

  • Pattern

    指定将与指定标头匹配的正则表达式。有关更多信息,请参阅正则表达式语法部分。

  • formatString的

    指定将生成新标头值的格式字符串。有关详细信息,请参阅格式字符串语法部分。

  • [标志]

    标志是以下标记的逗号分隔列表:

    • 我的情况)

      表示字符匹配,无论情况如何。此标志影响RewriteHeader指令和所有相应的RewriteCond 伪指令。

    • FF orbidden)

      停止重写过程,并向客户端发送404 Not Found响应(不是403禁止!而且这种行为对应于IIS 6行为)。请注意,FormatString在这种情况下是无用的,可以设置为任何非空字符串。

    • Ll ast规则)

      在此停止重写过程,不再应用任何重写规则。

    • NN ext迭代)

      强制重写引擎修改规则的目标,并从头开始重新启动规则检查(所有的修改都被保存)。重启次数受到RepeatLimit指令中指定的值的限制。如果超过此数值,N标志将被忽略。

    • NSÑ所述的EXT迭代小号 AME规则)

      像N标志一样工作,但是从相同的规则重新启动规则处理(即强制执行规则应用程序的重复)。单次规则迭代的最大数量由RepeatLimit指令给出。但是,大量的单个规则重复不对全局重复次数计算(即,由N个标志引起的重复次数的重复限制与由NS引起的重复次数无关)。

    • R(显式r edirect)

      强制服务器通过重定向指令立即向客户端发送响应,提供新的URI作为新位置。重定向规则始终是最后一条规则。

    • RP(永久重定向)

      与[R]标志几乎相同,但是问题301(永久移动)HTTP状态代码而不是302(暂时移动)。

    • U  (U nmangle Log)

      按照原始请求记录网址,而不是重写URL。

    • O  (n o rmalize)

      在处理之前规范化字符串。归一化包括删除URL编码,非法字符等。此外,URI的归一化完全删除了查询字符串。因此,如果需要查询字符串,则不应使用规范化。此标志对URL和URL编码的标题很有用。

    • CL  (C ase L ower)

      更改格式的情况下降。

    • CU  (C ase U pper)

      将格式的大小写更改为上限。

要删除标题,格式字符串模式应该生成一个空字符串。例如,此规则将从客户端请求中删除用户代理信息:

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指令

语法:RewriteProxy 模式FormatString [Flags]

将结果URI强制为内部强制作为代理请求,并立即通过处理代理请求的ISAPI扩展(即重写规则处理停止在此处)。这样IIS可以充当代理服务器,并将请求重新路由到其他站点和服务器。

  • 模式

    指定将与Request-URI匹配的正则表达式。有关更多信息,请参阅正则表达式语法部分。

  • formatString的

    指定将生成新URI的格式字符串。有关详细信息,请参阅格式字符串语法部分。对于此指令,FormatString应生成有效的URL(包括协议,主机等)或ISAPI_Rewrite代理模块将返回错误。

  • [标志]

    标志是以下标记的逗号分隔列表:

    • ð  (Рelegate安全)

      代理模块将尝试使用当前模拟用户的凭据登录远程服务器。在内置IIS身份验证的情况下,它将是发送原始请求的用户的凭据。有关详细信息,请阅读以下章节

    • C  (使用C重要信息)

      代理模块将尝试使用URL或基本身份验证头中指定的凭据登录远程服务器。使用此标志,您可以使用URL的http:// user:password@host.com/path/语法。有关详细信息,请阅读以下章节

    • FF ollow重定向)

      默认情况下,ISAPI_Rewrite将尝试将远程服务器返回的重定向指令(301,302等)映射到本地服务器命名空间中。如果远程服务器返回指向该服务器某处位置的重定向,则ISAPI_Rewrite将修改此重定向指令以指向本地服务器名称。这将隐藏用户的真实(内部)服务器名称。

      F标志可用于强制代理模块在内部遵循从远程服务器返回的重定向指令。如果您不需要从远程服务器接收重定向,请使用此标志。谨慎使用这个标志。它可能会破坏一些服务器应用程序。例如,.NET WinForms身份验证在重定向期间设置客户端cookie。如果代理将被指示处理此重定向cookie将丢失,用户将永远不会被认证。

    • 我的情况)

      表示字符匹配,无论情况如何。此标志影响RewriteProxy指令和所有相应的RewriteCond 伪指令。

    • U  (U nmangle Log)

      按照原始请求记录网址,而不是重写URL。

    • O  (n o rmalize)

      在处理之前规范化字符串。归一化包括删除URL编码,非法字符等。此外,URI的归一化完全删除了查询字符串。因此,如果需要查询字符串,则不应使用规范化。此标志对URL和URL编码的标题很有用。

    • H  (保留H ost)

      代理模块将使用当前主机头对远程服务器的请求。没有这个标志代理将从主机名和远程服务器的端口组成主机头。

    • A  (A dd身份验证头文件)

      允许在使用代理服务器的客户端认证时将认证信息从代理传递到内部服务器。代理模块将附加标题

      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架构和代理模块实现对可以与代理一起使用的身份验证方案施加明确的限制。可用的方案描述如下:

  • 匿名 - 匿名 - 客户端和代理之间以及代理服务器和远程服务器之间不进行身份验证。两个服务器(代理和远程)都应配置为允许匿名身份验证。C或D代理选项均不应被指定。
  • 匿名 - 基本 - 客户端和代理之间不进行身份验证。但远程服务器需要基本身份验证。存在两种可能性:
    • 用户直接对远程服务器进行身份验证。代理服务器应配置为匿名身份验证。启用任何其他身份验证将导致身份验证失败。远程服务器应允许基本认证。C或D代理选项均不应被指定。
    • 用户不对远程服务器进行身份验证。但代理使用显式凭据对远程服务器进行身份验证。登录凭证应在代理URL中明确指定。应指定C标志,不应设置D标志。
  • 匿名 - Windows集成 - 用户不对远程服务器进行身份验证。但代理使用IIS工作进程的凭据对远程服务器进行身份验证。代理服务器上的IIS工作进程应运行在其凭据将用于身份验证的帐户下。账号应具有网络访问权限。远程服务器应允许Windows集成身份验证。不应指定C标志。如果远程服务器不在Intranet中,则应指定D标志。
  • 基本 - 基本 - 用户对代理服务器进行身份验证,代理服务器使用用户凭据对远程服务器进行身份验证。两台服务器都应允许基本认证 应该指定C标志。不应指定D标志。
  • 基本 - Windows集成 - 用户对代理服务器进行身份验证,代理服务器使用用户凭据对远程服务器进行身份验证。代理服务器应允许基本认证。远程服务器应允许集成认证。应指定C或D标志(建议使用C)。
  • NTLM - NTLM - 用户对服务器上的代理应用程序进行身份验证,代理应用程序对相同服务器上的另一个应用程序进行身份验证(无法将NTLM身份验证委托给另一个服务器)。不应指定C标志。应指定D标志。
  • Kerberos - Kerberos - 用户对代理服务器和代理服务器的身份验证,然后使用用户提供的凭据对远程服务器进行身份验证。要实现此配置,必须满足以下要求:
    1. 客户端计算机,代理服务器和代理服务器应属于相同的Active Directory域或可信AD域(此要求使得该方案对于Internet应用程序几乎无用。尽管MS Article Kerberos互操作性指向了为非域配置Kerberos身份验证的可能性 - 客户端计算机,所需的配置步骤似乎对于互联网应用来说太复杂了)。
    2. 可能您必须将代理Web应用程序的应用程序池标识更改为域用户(您可以阅读文章 使用可配置帐户(IIS 6.0)配置工作进程标识 来了解创建自定义帐户所需的步骤)。虽然网络服务标识看起来像MSDN文章一样,但是我们无法使Kerberos在代理服务器和代理服务器之间运行。如果您设置自定义标识,则需要为其配置SPN。MSN KB Article 871179中描述了SPN 配置
    3. 应用程序池帐户应标记为“受信任的委派”。否则,如果本地系统帐户用作应用程序池标识,代理服务器应标记为“受信任的委派”。同时,客户帐户不应被标记为“对代理敏感”。有关帐户配置的详细信息,请参见文章“ 如何:实施Windows 2000的Kerberos委派”
    4. 如果要按名称访问代理服务器,这与NetBIOS和AD域名不同,则必须注册该名称的SPN。您可以阅读如何在文章中配置其他SPN 如何:在IIS中排除Kerberos相关问题
    5. 不应在ISAPI_Rewrite规则中指定C标志。应指定D标志。
    如果您有这个配置的问题,请阅读 如何:在联系支持之前排除IIS中的Kerberos相关问题文章。
  • NTLM - Kerberos - 使用NTLM身份验证的代理服务器进行身份验证,代理服务器依次使用Kerberos对远程服务器进行身份验证。该方案与Kerberos - Kerberos方案几乎相同。然而,它允许任何能够执行NTLM身份验证的互联网客户端通过代理访问内部服务器。该方案只能在Windows 2003纯模式下运行的AD域中实现。应将应用程序池帐户配置为允许将所有身份验证协议委托给代理服务器上的http服务。

 

CacheClockRate指令

语法:CacheClockRate 间隔

此指令只能在全局配置上下文中显示。如果在站点级上下文中找到该指令,将忽略该指令,并将错误消息写入httpd.parse.errors文件。

ISAPI_Rewrite在第一次加载时缓存每个配置文件。使用此指令可以指定特定站点的配置从高速缓存清除时的不活动时间段。通过将此参数设置得足够大,可以强制ISAPI_Rewrite从不回收其缓存。请记住,任何对配置文件的更改都会在下次请求后立即更新缓存,无论此间隔如何。

  • 间隔

    指定从高速缓存清除特定配置时的不活动时间(以秒为单位)。默认值为3600(1小时)。

EnableConfig和DisableConfig指令

语法:
EnableConfig
 [ SiteID |“站点名称” ] 
DisableConfig [ SiteID |“站点名称” ]

启用或禁用所选站点的站点级配置或更改默认值。默认情况下,启用了站点级配置。此指令只能在全局配置上下文中显示。如果在站点级上下文中找到,将被忽略,并将错误消息写入httpd.parse.errors文件。

  • SITEID

    网站的数字元数据库标识符

  • 网站名称

    该站点的名称显示在IIS控制台中。

如果不使用参数,则该指令将默认设置转换为启用/禁用配置处理。

例:

以下内容将仅为ID = 1的站点(通常为默认网站)和名为“我的站点”的站点启用配置:

DisableConfig
EnableConfig 1
EnableConfig“我的网站”

在以下示例中,对于名为“某些站点”的站点启用了配置,因为显式设置会覆盖默认设置。

EnableConfig“Some site”
DisableConfig

EnableRewrite和DisableRewrite指令

语法:
EnableRewrite
 [ SiteID |“站点名称” ] 
DisableRewrite [ SiteID |“站点名称” ]

启用或禁用所选站点的重写或更改默认值。默认情况下,重写已启用。此指令只能在全局配置上下文中显示。如果在站点级上下文中找到,将被忽略,并将错误消息写入httpd.parse.errors文件。

  • SITEID

    网站的数字元数据库标识符

  • 网站名称

    该站点的名称显示在IIS控制台中。

如果不使用参数,则该指令完全启用或禁用重写。

RepeatLimit指令

语法:RepeatLimit Limit

此指令可能出现在全局和站点级配置文件中。如果它将出现在全局配置文件中,它将更改所有站点的全局限制。如果此指令将显示在站点级配置文件中,则它将仅更改此站点的限制,并且此限制不能超过全局限制。

ISAPI_Rewrite允许循环处理规则(请参阅RewriteRule和RewriteHeader指令的N标志的说明)。该指令允许限制最大可能的循环数。它可以设置为零或一个以禁用循环。

  • 限制

    指定允许循环的最大数量。默认值为32。

RFStyle指令

语法: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]
      • 可选的-r参数强制脚本递归地在元数据库中注册扩展。
      • 可选MetabasePath参数允许指定要处理的第一个元数据库密钥。默认情况下是“/ localhost / W3SVC”。

       

      要在所有现有脚本映射中注册扩展名,您可以使用以下命令字符串调用脚本:

      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“。请注意,{}中不能有空格,下限和上限值无上限。所有重复表达式都指最短的以前的子表达式:单个字符; 一个字符集,或者一个与“()”分组的子表达式)。

例子:

  • “ba *”将匹配所有“b”,“ba”,“baaa”等
  • “ba +”将匹配“ba”或“baaaa”,但不匹配“b”。
  • “把?” 将匹配“b”或“ba”。
  • “ba {2,4}”将匹配“baa”,“baaa”和“baaaa”。

非贪心重复

非贪心重复可以通过附加一个'?' 经过重复; 不贪婪的重复是匹配最短字符串的重复。

例如,为了匹配html标签对,可以使用以下内容:

“<\ S *标记名[^>] *>(。*?)<\ S * /标记名\ S *>”

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

插入语

括号用于两个目的,将项目组合成子表达式,并标记生成的匹配项。例如,表达式“(ab)*”将匹配所有的字符串“ababab”。可以使用\ N或$ N语法返回引用括号中标记的所有子匹配。子表达式允许匹配空字符串。子表达式从左到右索引,从1开始,子表达式0是整个表达式。

非标记括号

有时您需要使用括号对子表达式进行分组,但是不希望括号中吐出另一个标记的子表达式,在这种情况下可以使用非标记括号(?:expression)。例如,以下表达式不创建子表达式:

“(?:ABC)*” 

备择方案

当表达式可以匹配一个子表达式或另一个子表达式时,会发生替代,每个替换由“|”分隔。每个替代方案是以前最大的子表达式; 这是与重复运算符相反的行为。

例子:

  • “a(b | c)”可以匹配“ab”或“ac”。
  • “abc | def”可以匹配“abc”或“def”。 

一组是一组可以匹配组中成员的单个字符的字符。集合由“[”和“]”分隔,并且可以包含文字,字符范围,字符类,整理元素和等价类。设置以“^”开头的声明包含以下元素的补充。

例子:

字符文字:

  • “[abc]”将匹配“a”,“b”或“c”。
  • “[^ abc]将匹配除”a“,”b“或”c“之外的任何字符。

角色范围:

  • “[az]”将匹配范围“a”到“z”中的任何字符。
  • “[^ AZ]”将匹配“A”到“Z”范围之外的任何字符。

角色班

字符类在集合声明中使用语法“[:classname:]”表示,例如“[[:space:]]”是所有空格字符的集合。可用的字符类是: 

alnum 任何字母数字字符。
α 任何字母字母az和AZ。其他字符也可能包括在内。
空白 任何空白字符,空格或制表符。
CNTRL 任何控制字符。
数字 任意数字0-9。
图形 任何图形字符。
降低 任何小写字母az。其他字符也可能包括在内。
打印 任何可打印字符。
PUNCT 任何标点符号。
空间 任何空格字符。
任何大写字母AZ。其他字符也可能包括在内。
xdigit 任何十六进制数字字符,0-9,af和AF。
任何字词 - 所有字母数字字符加下划线。
统一 任何代码大于255的字符,这仅适用于宽字符traits类。

有一些捷径可以用来代替字符类:

  • \ w代替[:word:]
  • \ s代替[:space:]
  • \ d代替[:digit:]
  • \ l代替[:lower:]
  • \ u代替[:upper:] 

整理元素

整理元素在集合声明中采用通用形式[.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伪指令是全局的。

前瞻性前瞻性断言

这有两种形式; 一个是正??面前瞻性的断言,一个是负面的前瞻性断言:

  • “(?= abc)”只匹配零字符,后跟表达式“abc”。
  • “(?!abc)”只有在后面没有表达式“abc”的情况下才匹配零字符。

 

字操作符

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

  • “\ w”与“word”字符类的任何单个字符匹配,这与表达式“[[:word:]]”相同。
  • “\ W”匹配任何不是“word”字符类成员的单个字符,这与表达式“[^ [:word:]]”相同。
  • “\ <”匹配单词开始处的空字符串。
  • “\>”匹配单词末尾的空字符串。
  • “\ b”与单词的开始或结尾处的空字符串相匹配。
  • “\ B”匹配单词中的空字符串。

逃脱操作员

转义字符“\”有几个含义。

  • 逃生操作员可以引入操作者,例如:返回引用或字操作符。
  • 转义运算符可以使以下字符正常,例如“\ *”表示文字“*”,而不是重复运算符。

单字符转义序列:

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

逃生顺序 字符代码 含义
\一个 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算法。只有当表达式与整个输入序列匹配时,结果才匹配。例如:

  • RewriteCond URL ^ / somedir /.*#将匹配任何对somedir目录和子目录的请求,而
  • RewriteCond URL ^ / somedir / #will只匹配somedir的根目录

关于“病态”正则表达式的特别说明

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。

例子

特色文章:使用ISAPI_Rewrite进行URL重写

本文是“ ASP.NET专业搜索引擎优化 ”一书的第3章“引人注目的SE友好URL”的编辑形式  Cristian Darie和Jaimie Sirovich的SEO开发人员指南

本文介绍了如何在动态网站中逐步使用静态和关键字访问URL的大多数流行技术。

在单个站点上模拟基于主机头的虚拟站点

例如,您已注册了两个域名www.site1.comwww.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]

请注意,此规则可能会将与CSS,图像等的页面相关链接断开。这是由于浏览器正在使用的基本路径(页面的父文件夹)进行更改以计算完整的资源URI。有三种可能的解决方案:

  1. 使用下面给出的规则。它不影响基本路径。
  2. 借助<base href =“/ folder / page.asp”>标签直接指定页面的正确基本路径。
  3. 将所有页面相对链接更改为根相对或绝对形式。

 

该规则将从请求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的互联网服务器和运行其他平台的几个公司服务器。这些服务器不能从互联网直接访问,只能从我们的公司网络访问。以下是一个简单的示例,如何使用代理标记将另一个服务器映射到IIS站点的命名空间中:

[下ISAPI_Rewrite]
RewriteProxy /mappoint(.+)http \:// sitedomain $ 1 [I,U]

将站点从UNIX移动到IIS

这个规则可以帮助将/?用户名更改为/ 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

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文件,内容是动态生成的。

否定表达式(NOT)

有时,当某些模式不匹配时,您需要应用规则。在这种情况下,您可以在正则表达式中使用所谓的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实用程序可用于模拟规则执行。以下示例说明其用法。

  1. 一个简单的规则:

    RewriteRule(。+)http \:// newwebserver $ 1 [I,R]
    正则表达式文本框将对应于规则的模式部分。这将是:
    (+)

    格式字符串文本框将对应于规则的格式部分。在这种情况下,它将是:
    HTTP \:// newwebserver $ 1

    忽略大小写复选框将对应于规则的I标志。所以应该检查。
    / test这样的东西可以作为测试字符串。然后,您将获得 http:// newwebserver / test作为格式结果

     

  2. 具有条件的规则:

    RewriteCond主机:(?!www \。)(。+)
    RewriteRule(。+)http \://www.$1$2 [I,RP]
    要将两个正则表达式组合成一个单一的,可以使用不会在真实URI中出现的一些分隔符。例如,可能是。那么正则表达式将是:
    (?!万维网\。)(。+)!(+)

    格式字符串文本框将是:
    HTTP \://www.$1$2

    将忽略大小写复选框。
    如果www.host.com!/任何内容将被视为测试字符串结果将不匹配。但是host.com!/任何东西都会产生http://www.host.com/anything

     

  3. 迭代规则:

    RewriteRule(。*?\。asp)(\?[^ /] *)?/([^ /] *)/([^ /] *)(。*)$ 1(?2 $ 2& = $ 4 $ 5 [NS,I]
              
    这种规则(具有N或NS标志)在整个正则表达式测试工具中无法模拟。但是可以一步一步地模拟。最初的规则可以像以前的样本一样分裂成一个模式格式。然后在第一步,可以提供一些测试字符串,这将导致一些格式结果。此格式结果应作为第二步等的测试字符串

     

 

功能历史

ISAPI_Rewrite版本2.13 build 73:

  • 修复代理在应用程序池关闭时可能的崩溃。
  • 编译VC 9 SP1和Boost 1.38。

ISAPI_Rewrite版本2.13 build 71:

  • 在配置名称解析期间发生元数据库错误时,修复了每个站点配置的永久“丢失”。
  • 当配置文件被其他应用程序锁定以供写入时,增加了绕过配置的逻辑。
  • 修复了从配置缓存中删除未使用的配置的可能罕见的崩溃。
  • 编译VC 9和Boost 1.35。

ISAPI_Rewrite版本2.12 build 70:

  • 当客户端延迟请求身体传输时,修复代理中的可能请求超时。

ISAPI_Rewrite版本2.11 build 69:

  • 编译Boost 1.34.1。

ISAPI_Rewrite版本2.11 build 68:

  • 更新了配置实用程序清单以禁用Vista上的虚拟化。
  • 编译Boost 1.34。

ISAPI_Rewrite版本2.11 build 67:

  • 修复代理中零内容长度响应的可能AV。
  • 向代理子请求添加了头部X-Forwarded-For,X-Forwarded-Host和X-Forwarded-Server。

ISAPI_Rewrite版本2.10 build 66:

  • Vista兼容性更新。

ISAPI_Rewrite版本2.9 build 65:

  • 代理不会删除空标题。他们将直接传递给代理服务器。

ISAPI_Rewrite版本2.9 build 64:

  • 向代理添加分块请求支持。但是,不支持预告片头。

ISAPI_Rewrite版本2.9 build 63:

ISAPI_Rewrite版本2.8 build 62:

  • 改进了保持处理。对于HTTP / 1.0请求和没有Content-Length标头的响应(304除外),Keep-alive已被禁用。

ISAPI_Rewrite版本2.8 build 61:

  • 修复了由VC8 STL错误引起的EnableRewrite / DisableRewrite和EnableConfig / DisableConfig指令的崩溃。

ISAPI_Rewrite版本2.8 build 60:

  • 修复IIS日志中的代理不正确的状态代码。
  • 在客户端和代理之间启用Keep-Alive。

ISAPI_Rewrite版本2.8 build 59:

  • x64版本发布。x64版本接受与32位版本相同的密钥。
  • 修复代理中可能的堆栈损坏(在迁移到VC8 CRT期间在构建58中引入)。

ISAPI_Rewrite版本2.8 build 58:

  • x64版本发布候选人。
  • 实验安腾版本。不幸的是,我们目前还没有基于Itanium的系统,所以我们甚至不能测试。但是,我们觉得它应该可以工作,因为它使用与其他版本相同的代码库。任何反馈将是有价值的。
  • 用Visual Studio 2005编译。

ISAPI_Rewrite版本2.8 build 57:

ISAPI_Rewrite版本2.8 build 56:

  • 更改了“保留H ost”标志逻辑以保留主机头的主机名和端口(只有主机名保留在以前的版本中)。

ISAPI_Rewrite版本2.8 build 55:

  • 修复了未启用显式代理身份验证时从代理子请求中不正确地删除授权头。

ISAPI_Rewrite版本2.8 build 54:

ISAPI_Rewrite Beta版本2.7 build 53 fox x64和安腾:

  • Beta x64和Itanium版本的ISAPI_Rewrite Full。

ISAPI_Rewrite版本2.7 build 53:

  • 修复了在Lite和ISA版本中破坏的NS标志支持。

ISAPI_Rewrite版本2.7 build 52:

  • 修正了在构建51中引入的代理响应中的Transfer-Encoding头的错误。

ISAPI_Rewrite版本2.7 build 51:

  • 许可证密钥已更改!新的许可证密钥格式为AAAAA-BBBBB-CCCCC-DDDDD。
    如果您有ISAPI_Rewrite 2.x的旧密钥,请访问 此页面续订您的密钥。
  • 固定IIS终止,试用期满。
  • ISAPI_Rewrite为ISA 2004发布。
  • 修复将两个Connection头插入到代理响应中的可能性。

ISAPI_Rewrite版本2.7 build 50(内部):

  • 为ISA 2004创建了ISAPI_Rewrite。
  • 向RewriteRule和RewriteHeader添加了NS标志(重复相同的规则)。

ISAPI_Rewrite版本2.6 build 49:

  • 修正了在条件中不包含括号的包含替代方法的规则的不正确解析

ISAPI_Rewrite版本2.6 build 48:

  • 将CL(case lower)和CU(case upper)标志添加到RewriteRule和RewriteHeader
  • 编译boost 1.32

ISAPI_Rewrite版本2.5 build 47:

  • 修复了由于WinHTTP错误引起的代理崩溃。

ISAPI_Rewrite版本2.5 build 46:

  • 修复了新的禁止(回归)可能的代理崩溃。
  • 改进的重定向和禁止RFC合规性。

ISAPI_Rewrite版本2.5 build 45:

  • 修正了在构建44中引入的DisableRewrite指令的错误。

ISAPI_Rewrite版本2.5 build 44:

  • 减少进程执行过滤器的内存消耗。
  • 向安装添加了高级错误日志记录。
  • 修复配置实用程序中注册表中“Helper URL”参数的不正确加载。

ISAPI_Rewrite版本2.5 build 43:

  • 代理模块将更改3xx响应的位置标题,以指向代理服务器,如果它最初指向代理的服务器。
  • 修复内存泄漏和WinHTTP处理代理模块中的泄漏,以防超时。
  • 添加了对文档运行ISAPI_Rewrite所需的权限的描述。

ISAPI_Rewrite版本2.4 build 42:

  • 修复代理模块中针对请求的WinHTTP超时设置不正确的问题。

ISAPI_Rewrite版本2.4 build 41:

  • 解决代理模块中长查询字符串的问题。

ISAPI_Rewrite版本2.3 build 39:

  • 适用于非贪心模式的Regex ++修复。

ISAPI_Rewrite版本2.3 build 38:

  • 从boost 1.31.0编译了新的Regex库。匹配速度明显提高。
  • 固定RXTest实用程序崩溃的“病态”正则表达式。

ISAPI_Rewrite版本2.3 build 37:

  • 修复了旧式HTTPS重定向和禁止的问题。

ISAPI_Rewrite版本2.2 build 32:

  • 向RewriteRule / RewriteHeader指令添加了永久重定向[RP]标志
  • 增加了通过配置实用程序配置代理模块的连接,发送和接收超时的可能性。

ISAPI_Rewrite版本2.2 build 30:

  • 代理模块被重新设计并重写,以使用IIS的异步I / O功能。
  • 线程池策略已更改:
    • “Threads Spawn Threshold”参数被替换为2个新参数 - “工作线程限制”和“活动线程限制”。
  • 增加了将Outlook断开的注册密钥自动修复到配置实用程序的可能性。
  • 代理模块使用WinHTTP 5.1。

ISAPI_Rewrite版本2.1 build 28:

  • 修复了与新的保护系统有关的几个问题:
    • 代理模块中的“访问内存位置无效”。
    • 某些每个站点配置可能无法正常工作。
    • 过滤器在站点级安装时可能无法正常工作。
  • 增加了手动产品安装的可能性。
  • 代理模块现在返回更友好的错误消息。

ISAPI_Rewrite版本2.1 build 24:

  • 搬到新的试用保护制度。修复了几个错误与试用检查。
  • 新指令RewriteProxy带来更灵活的代理功能。
  • 修正了EnableRewrite / DisableRewrite的错误。
  • 代理模块现在向客户端发送重定向响应。
  • 修复了文档中的几个错误。

ISAPI_Rewrite版本2.0.1 build 22:

  • 在脚本映射(仅限完整版)中添加了手动代理模块注册的脚本。看看进入配置实用程序 的细节部分。
  • 添加新的配置指令RFStyle以控制重定向和禁止响应样式(仅限完整版本)。重定向和禁止现在可以以与1.3(旧样式)或2.0(新样式)相同的方式发布。默认是旧的方式。

ISAPI_Rewrite版本2.0 build 21:

  • 改变“病理”规则保护。失败的规则不再被禁用。

ISAPI_Rewrite版本2.0 build 20:

  • 现在ISAPI_Rewrite支持代理吞吐量。在RewriteRule或RewriteHeader指令中使用[P]标志代理请求。有关代理模块配置的详细信息,请查看文档的配置实用程序部分。
  • 新的指令EnableRewrite和DisableRewrite可用于全局或每个站点分别启用或禁用重写。
  • 新指令EnableConfig和DisableConfig旨在为所选站点启用或禁用站点级配置。
  • 现在ISAPI_Rewrite Full有一个试用期。
  • 新的帮助者ISAPI扩展旨在服务代理,重定向和阻止请求。
  • 从Boost 1.29.0使用新的Regex ++版本,具有更多错误修复和新功能。

ISAPI_Rewrite版本1.3 build 16:

  • 对正则表达式++正则表达式引擎进行了一些修改,以克服需要指数时间处理的“病理”规则的问题。现在处理单一规则的时间限制在半秒。如果规则无法在此时完成处理,并且ISAPI_Rewrite向客户端发送“500内部服务器错误”以指示配置错误。
  • 向RewriteRule和RewriteHeader指令添加了新的N(下一个)标志。在处理规则时可以组织循环。
  • 添加了RepeatLimit指令以限制可能的循环数。
  • 向RewriteRule和RewriteHeader指令添加了F(禁止)标志。如果检测到正面匹配,它将强制向客户端发送“404 Not Found”响应。
  • 向RewriteRule,RewriteHeader和RewriteCond指令添加了O(nOrmalize)标志。它指出,首先检查的字符串应该被归一化(即URL编码,非法字符等)被删除。
  • 增加了使用RewriteCond指令检查ServerVariables的可能性。可以使用%ServerVariable而不是头名称来完成。
  • 改进的配置解析过程错误日志记录。现在错误消息包含行号。

ISAPI_Rewrite版本1.2 build 14(仅限完整版):

  • 修复了完整版本1.1 build 11中引入的问题。配置标志CacheClockRate未正确解析。而第一次缓存清理后,inetinfo.exe进程开始耗用99%的CPU时间。

ISAPI_Rewrite版本1.2 build 13:

  • 添加了新的标志U(Unmangle Log)。现在ISAPI_Rewrite可以按照原始请求记录URL。

ISAPI_Rewrite版本1.1 build 11:

  • 解决了截断配置文件的最后一个字符的问题。
  • 修复了文档和默认配置文件的几个缺点。
  • 包括Internet Information Server 6.0的额外优化。
  • ISAPI_Rewrite现在将自定义标头与原始URL信息添加到客户端请求中,因此可以在服务器脚本中检索原始URL。
  • New  RewriteHeader指令现在允许不仅重写客户端请求的URL部分,而且可以重写任何其他HTTP头或甚至方法和版本信息。