(图片来自:https://github.com/Bikeman868/UrlRewrite.Net)
Using Rewrite Maps in URL Rewrite Module
In this walkthrough you will create two rewrite maps: one rewrite map will be used by rule that performs url rewriting, and another rewrite map will be used by rule that performs redirects to a different domain.
两个演练,一个url重写,一个重定向到不同的domain
<rules>
<rule name="Rewrite Rule">
<!--这里的点告诉url重写模块,匹配所有的输入url(通过使用正则表达式的点符号)-->
<match url=".*" />
<conditions>
<!--这个条件,检查从rewrite map的StaticRewrites的返回值,不能为空字符串,为了执行此检查,将服务器变量 request_uri的值作为参数传递给重写映射.如果重写映射包含带有键的条目,该条目与REQUEST_URI相同,则将返回与该键对应的值。-->
<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<!--此元素指定URL重写模块需要使用从重写映射中提取的新URL字符串重写当前URL字符串。这里的{C:1}的后向引用,所指究竟是什么?它的back-reference蕴含着什么意义?-->
<action type="Rewrite" url="{C:1}" />
</rule>
</rules>
可以参考:https://docs.microsoft.com/zh-cn/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference
UrlRewrite.NET是对官方提供的重写方案的替换,不是补充。
https://github.com/Bikeman868/UrlRewrite.Net
New functionality
这是相对重要的部分,它对Microsoft的Rewrite机制进行了扩展
。。。
明确每个节点,及其对应的含义。
Solution文件夹中有对应的示例代码:
描述:document的根元素,这里的document所指是对应的xml配置文件
父节点:没有父节点
子节点:rules、rewriteMaps
规则:只能有一个rules子元素,所有的rewriteMaps的子节点必须在rules子节点的前面
描述:rule元素列表的容器
name属性:仅用于追踪输出
stopProcessing属性:默认是true,通过设置成false,停止stopProcessing标志从当前列表内的规则传播到父规则
父节点:rewrite或者rule
子节点:rule和assembly
规则:assembly子节点必须放在rule子节点的前面。rule子节点引用程序集的自定义扩展。建议将assembly放在子节点的最上方
描述:rewriteMap元素列表的容器
父节点:rewrite
子节点:rewriteMap
规则:子节点必须有唯一的names属性
描述:定义一个查找的字典,用起来像一个 大括号的扩展中函数。
name属性:name用于引用大括号中的映射
defaultValue属性:当在字典中没有匹配的条目的情况下, 返回的默认值
父节点:rewriteMaps
子节点:add
规则:子节点必须有唯一的键
描述:在rewrite map dictionary,重写映射字典中的条目
key属性:字典的key
value属性:字典的值
父节点:rewriteMap
子节点:无
规则:无
描述:定义一个包含自定义扩展的程序集
filename属性:.NET DLL不带.dll扩展名的名称
父节点:rules
子节点:class
规则:.NET程序集应该放在web站点的bin文件夹下
描述:定义一个实现自定义扩展的.NET类
name属性:如何在重写规则中引用此扩展
type属性:必须是operation,action或者condition
className属性:.NET类的完全限定名称。这个类必须实现IOperation,IAction或者ICondition
父节点:assembly
子节点:无
规则:在重写规则文件中,name属性和type属性的组合必须是唯一的
描述:定义一个特定条件满足的情况下,执行的一系列行为
name属性:仅用于追踪输出以识别规则
stopProcessing属性:默认为false,如果满足此规则的条件,则设置为true以停止处理此列表中的规则,需要关注的是父级rules元素也能设置stopProcessing="true" 传播给下一级。另外需要注意的是,某些操作会导致处理停止,在这种情况下此标志是多余的
dynamic属性:默认为false,设置为true表示对于相同的URL,此规则的条件可以在不同时间产生不同的结果,因此无法缓存规则评估的结果
enabled属性,默认为true,设置false的时候是指移除rewriter的规则,它的含义就是对应规则的启用、禁用的规则。
父节点:rules
条件子节点:match、condition和conditions
行为子节点:action、rewrite、rules、delete、keep、insert、append和normalize
规则:所有的条件子节点在进行任何action子节点之前进行评估,只有在所有条件都满足的前提下才执行,action和condition都按照调顺序执行和检测。如果rule不包含条件的情况下, 它的对应的actions将会一直执行。
描述:定义一组条件,这些条件的值组成一个布尔值
logicalGrouping属性:默认是matchAll,也可以设置成mathNone或者matchAny
trackAllCaptures属性:默认false,这意味着每个正则表达式的捕获组都会替换任何先前的正则表达式的捕获组。将其设置为true意味着每个正则表达式将其捕获组添加到列表中,而不是替换它们。
父节点:rule或者conditions
子节点:add、condition和conditions
规则:无
描述:定义要执行规则中的操作必须满足的条件。可以将它们放在conditions元素中,以定义如何组合多个条件的逻辑。
scope属性:定义要测试的请求的哪一部分。可以是:originalUrl, originalPath, originalQueryString, originalPathElement,originalParameter,originalHeader,url,path,matchPath,queryString, pathElement, parameter, header, originalServerVariable, serverVariable, literal, conditionGroup or matchGroup
index属性:当scope是originalPathElement、pathElement、conditionGroup 、matchGroup的情况下期望是一个整数值。当scope是originalParameter、originalHeader、parameter、header、originalServerVariable、serverVariable、literal的时候index的期望值是字符串。对于其他scope值,index属性并不适用
test属性:明确对应于scope范围所要执行的测试。默认是matchRegex。也可以是 startsWith,endsWith,contains,equals,matchWildcard,mathRegex,greater,less。也可能是定义在assembly节点中的顶政治化条件
value属性:针对test属性测试的值。依赖于是数字还是字符串。为测试指定的值是受限制的,例如,不能对数字执行包含测试。
negate属性:默认是false,设置为true可反转结果。这对于测试参数不为空的情况非常有用。
ignoreCase:默认为true。设置为false的时候在字符串的比较将大小写敏感。如果value属性包含数字的情况下
父节点:rule或者conditions
子节点:无
规则:无
描述:使传入的请求看起来都一样,以简化编写规则。这通常放在一个无条件的rule节点中
pathLeadingSeparator属性:默认为none,可以设置成add或者remove
pathTrailingSeparator属性:默认为none,可以设置成add或者remove
父节点:rule
子节点:none
规则:如果指定要添加分隔符,并且已经有一个分隔符,则不会添加另一个分隔符。同样,如果您指定删除分隔符,但分隔符不存在,则不会进行任何更改
描述:此元素的大部分功能仅用于向后兼容。不要在编写新规则中使用url属性
url属性:指定要重定向的url。支持{}大括号扩展语法。如果为了向后兼容而传递相对URL,则在URL前面添加 斜杠 /
appendquerystring属性:默认为true,从原始请求复制整个查询字符串并将其附加到URL属性值。设置为false可禁用此行为。
redirectType属性:默认值为307。仅用于当 type=“redirect” 的情况下,或者 type没有指定的情况下。指定将要返回给浏览器的HTTP响应码,可能是301,302,303,307,permanent,found,seeother,temporary
type属性:type属性仅仅在redirectType没有指定的时候,才指定type属性。它包含将要执行的action类型的名称,这可能是一个定义在class元素节点中的自定义的操作,也可以是以下内置操作类型之一:redirect,rewrite,customresponse,abortrequest,none
statusline属性:仅当type=“customResponse”的时候可应用。它定义了要发送回浏览器的HTTP响应的第一行
responseline属性:仅当type=“customResponse”的情况下是可用的。它定义了要发回浏览器的HTTP响应的第二行
父节点:rule
子节点:无
规则:仅当url属性提供的情况下, appendquerystring属性才可用。推荐不使用url参数,而是在规则中增加编辑操作,例如 rewrite,append 等等,定义重定向前对URL所作的更改。注意,除了none和rewrite之外,所有的内置操作类型都会停止进一步规则的处理。因此在rule元素上不需要停止处理标志。如果您编写自己的自定义操作,则可以决定是否停止处理(ME:这个含义不太明确究竟是什么意思)
描述:用新的值替换url的部分
to属性:指定url的重写部分,默认为path,但也可能是url,queryString,pathElement,parameter,header或者serverVariable
toIndex属性:当to="pathElement" 的情况下,这是路径的整数索引,正值从做左到右,负值从右到左。当to是parameter,header或者serverVariable时,这是要覆盖的 query sting parameter,header 或者server variable的名称。对于此属性,所有的其他值不适用
from属性:指定从中获取的值的位置,该值将要覆盖URL中的部分内容。默认为path,但是也可以是originalUrl,originalPath,originalQueryString,originalPathElement,originalParameter,originalHeader,url,queryString,pathElement,parameter,header,originalServerVariable,serverVariable,literal,conditionGroup,或者 matchGroup
fromIndex属性:对于路径元素,这是路径的索引。对于请求的命名部分,这是该部分的名称(例如,服务器变量的名称),对于其他范围,这个属性不适用。
operation属性:应用于from值,然后再写入to位置。可以是class元素中定义的自定义操作的名称,rewriteMap的名称,或者内置操作toLower、toUpper、urlEncode或者urlDecode之一
value属性:这是同时设置from="literal"和fromIndex属性的快捷方式
父节点:rule
子节点:无
规则:当from="literal"的时候,可以在fromIndex属性中使用{}宏扩展语法。宏扩展在本文档的其他地方有更详细的描述。这也适用于value属性
描述:这个元素类似于rewrite元素,除了它附加到现有值而不是覆盖它之前
to属性:指定应在网址的哪一部分后面附加。追加到路径假定您要添加新的path元素,并在必要时将路径分隔符添加到路径。附加到路径元素会将文本添加到路径元素的末尾,而不会更改路径中元素的数量。路径元素可以从左到右用正索引引用,也可以从右到左用负索引引用。追加到路径元素0与追加到整个路径相同。附加到标题,查询字符串参数和服务器变量之类的其他内容后,会将文本添加到标题,查询字符串或服务器变量值的末尾。
toIndex属性:参考rewrite元素文档
from属性:参考rewrite元素文档
fromIndex属性:参考rewrite元素文档
operation属性:参考rewrite元素文档
value属性:参考rewrite元素文档
父节点:rule
子节点:无
规则:参考rewrite元素文档
描述:该元素将新的path元素插入到路径的中间。您引用现有路径元素,新值将插入到该位置,将当前位置的当前值向右移动。
to属性:此操作仅支持pathElement范围,这是默认设置,因此可以省略此属性
toIndex属性:要替换的现有路径元素的索引。传递1会将新值插入路径元素1,将所有其他元素向右推1个位置。传递值-1将用新值替换路径中的最后一个元素,将当前的最后一个路径元素向右推1。如果您引用不存在的路径元素,则不会采取任何措施,即,如果您指定索引 值为2,且路径仅包含1个元素,则不会修改url。
from属性:参考rewrite元素文档
fromIndex属性:参考rewrite元素文档
operation属性:参考rewrite元素文档
value属性:参考rewrite元素文档
父节点:rule
子节点:无
规则:参考rewrite元素文档
描述:从原始请求中删除信息
scope属性:指定要删除的请求部分。默认为pathElement,但也可以为url,path,queryString,标头,参数或serverVariable
index属性:当scope =“ pathElement”时,在路径中指定一个索引。路径索引0会删除整个路径,1会删除第一个元素,2会删除第二个元素,等等。路径元素索引的负值将从路径的右端删除。当范围为 header, parameter或serverVariable时,此属性包含header的名称,query string parameter或要删除的server variable。不适用于其他范围。
父节点:rule
子节点:无
规则:无
描述:执行除功能类型以外的所有删除操作。例如,如果您只想保留查询字符串中的某些参数并删除所有其他参数,则此操作可以做到这一点
scope属性:定义请求的哪一部分将受到影响。默认为parameter但也可以为header或pathElement
index属性:以逗号分隔的要保留元素列表。对于pathElement来说,它们是整数值,对于其他作用域来说,它们是名称
父节点:rule
子节点:无
规则:无
描述:存在此元素仅是为了向后兼容。我建议您不要在编写的任何新规则中使用它。元素定义了要应用规则必须满足的条件
url属性:正则表达式或通配符表达式以匹配包括查询字符串在内的整个URL
patternSyntax属性:默认为ECMAScript,但也可以为通配符
negate属性:默认为false。设置为true以反转结果
ignoreCase属性:默认为true。设置为false以区分大小写
父节点:rule
子节点:无
规则:在匹配之前,URL将有任何前导/删除。这是为了向后兼容
范围用于指定在请求中读取或修改的内容。当请求中有多个内容时,作用域还需要一个索引来指定要操作的内容。例如,当范围是path时,请求中只有一个路径,因此不需要索引,但是当范围是header时,您需要指定哪个头。
请注意,并非所有范围都适用于所有情况。请参阅元素的描述以获取适用范围的列表。