前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >URL重写

URL重写

作者头像
问问计算机
发布2021-05-08 11:16:25
4.9K0
发布2021-05-08 11:16:25
举报
文章被收录于专栏:问问计算机问问计算机

(图片来自:https://github.com/Bikeman868/UrlRewrite.Net)

1.Microsoft Rewrite

代码语言:javascript
复制
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
代码语言:javascript
复制
<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是对官方提供的重写方案的替换,不是补充。

2.UrlRewrite.NET

https://github.com/Bikeman868/UrlRewrite.Net

代码语言:javascript
复制
New functionality
这是相对重要的部分,它对Microsoft的Rewrite机制进行了扩展
。。。

明确每个节点,及其对应的含义。

Solution文件夹中有对应的示例代码:

Syntax Reference 语法参考

rewrite

描述:document的根元素,这里的document所指是对应的xml配置文件

父节点:没有父节点

子节点:rules、rewriteMaps

规则:只能有一个rules子元素,所有的rewriteMaps的子节点必须在rules子节点的前面

rules

描述:rule元素列表的容器

name属性:仅用于追踪输出

stopProcessing属性:默认是true,通过设置成false,停止stopProcessing标志从当前列表内的规则传播到父规则

父节点:rewrite或者rule

子节点:rule和assembly

规则:assembly子节点必须放在rule子节点的前面。rule子节点引用程序集的自定义扩展。建议将assembly放在子节点的最上方

rewriteMaps

描述:rewriteMap元素列表的容器

父节点:rewrite

子节点:rewriteMap

规则:子节点必须有唯一的names属性

rewriteMap

描述:定义一个查找的字典,用起来像一个 大括号的扩展中函数。

name属性:name用于引用大括号中的映射

defaultValue属性:当在字典中没有匹配的条目的情况下, 返回的默认值

父节点:rewriteMaps

子节点:add

规则:子节点必须有唯一的键

rewriteMap->add

描述:在rewrite map dictionary,重写映射字典中的条目

key属性:字典的key

value属性:字典的值

父节点:rewriteMap

子节点:无

规则:无

assembly

描述:定义一个包含自定义扩展的程序集

filename属性:.NET DLL不带.dll扩展名的名称

父节点:rules

子节点:class

规则:.NET程序集应该放在web站点的bin文件夹下

class

描述:定义一个实现自定义扩展的.NET类

name属性:如何在重写规则中引用此扩展

type属性:必须是operation,action或者condition

className属性:.NET类的完全限定名称。这个类必须实现IOperation,IAction或者ICondition

父节点:assembly

子节点:无

规则:在重写规则文件中,name属性和type属性的组合必须是唯一的

rule

描述:定义一个特定条件满足的情况下,执行的一系列行为

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将会一直执行。

conditions

描述:定义一组条件,这些条件的值组成一个布尔值

logicalGrouping属性:默认是matchAll,也可以设置成mathNone或者matchAny

trackAllCaptures属性:默认false,这意味着每个正则表达式的捕获组都会替换任何先前的正则表达式的捕获组。将其设置为true意味着每个正则表达式将其捕获组添加到列表中,而不是替换它们。

父节点:rule或者conditions

子节点:add、condition和conditions

规则:无

condition

描述:定义要执行规则中的操作必须满足的条件。可以将它们放在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

子节点:无

规则:无

normalize

描述:使传入的请求看起来都一样,以简化编写规则。这通常放在一个无条件的rule节点中

pathLeadingSeparator属性:默认为none,可以设置成add或者remove

pathTrailingSeparator属性:默认为none,可以设置成add或者remove

父节点:rule

子节点:none

规则:如果指定要添加分隔符,并且已经有一个分隔符,则不会添加另一个分隔符。同样,如果您指定删除分隔符,但分隔符不存在,则不会进行任何更改

action

描述:此元素的大部分功能仅用于向后兼容。不要在编写新规则中使用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:这个含义不太明确究竟是什么意思)

rewrite【这个应该是主要部分】

描述:用新的值替换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属性

append

描述:这个元素类似于rewrite元素,除了它附加到现有值而不是覆盖它之前

to属性:指定应在网址的哪一部分后面附加。追加到路径假定您要添加新的path元素,并在必要时将路径分隔符添加到路径。附加到路径元素会将文本添加到路径元素的末尾,而不会更改路径中元素的数量。路径元素可以从左到右用正索引引用,也可以从右到左用负索引引用。追加到路径元素0与追加到整个路径相同。附加到标题,查询字符串参数和服务器变量之类的其他内容后,会将文本添加到标题,查询字符串或服务器变量值的末尾。

toIndex属性:参考rewrite元素文档

from属性:参考rewrite元素文档

fromIndex属性:参考rewrite元素文档

operation属性:参考rewrite元素文档

value属性:参考rewrite元素文档

父节点:rule

子节点:无

规则:参考rewrite元素文档

insert

描述:该元素将新的path元素插入到路径的中间。您引用现有路径元素,新值将插入到该位置,将当前位置的当前值向右移动。

to属性:此操作仅支持pathElement范围,这是默认设置,因此可以省略此属性

toIndex属性:要替换的现有路径元素的索引。传递1会将新值插入路径元素1,将所有其他元素向右推1个位置。传递值-1将用新值替换路径中的最后一个元素,将当前的最后一个路径元素向右推1。如果您引用不存在的路径元素,则不会采取任何措施,即,如果您指定索引 值为2,且路径仅包含1个元素,则不会修改url。

from属性:参考rewrite元素文档

fromIndex属性:参考rewrite元素文档

operation属性:参考rewrite元素文档

value属性:参考rewrite元素文档

父节点:rule

子节点:无

规则:参考rewrite元素文档

delete

描述:从原始请求中删除信息

scope属性:指定要删除的请求部分。默认为pathElement,但也可以为url,path,queryString,标头,参数或serverVariable

index属性:当scope =“ pathElement”时,在路径中指定一个索引。路径索引0会删除整个路径,1会删除第一个元素,2会删除第二个元素,等等。路径元素索引的负值将从路径的右端删除。当范围为 header, parameter或serverVariable时,此属性包含header的名称,query string parameter或要删除的server variable。不适用于其他范围。

父节点:rule

子节点:无

规则:无

keep

描述:执行除功能类型以外的所有删除操作。例如,如果您只想保留查询字符串中的某些参数并删除所有其他参数,则此操作可以做到这一点

scope属性:定义请求的哪一部分将受到影响。默认为parameter但也可以为header或pathElement

index属性:以逗号分隔的要保留元素列表。对于pathElement来说,它们是整数值,对于其他作用域来说,它们是名称

父节点:rule

子节点:无

规则:无

match

描述:存在此元素仅是为了向后兼容。我建议您不要在编写的任何新规则中使用它。元素定义了要应用规则必须满足的条件

url属性:正则表达式或通配符表达式以匹配包括查询字符串在内的整个URL

patternSyntax属性:默认为ECMAScript,但也可以为通配符

negate属性:默认为false。设置为true以反转结果

ignoreCase属性:默认为true。设置为false以区分大小写

父节点:rule

子节点:无

规则:在匹配之前,URL将有任何前导/删除。这是为了向后兼容

scopes

范围用于指定在请求中读取或修改的内容。当请求中有多个内容时,作用域还需要一个索引来指定要操作的内容。例如,当范围是path时,请求中只有一个路径,因此不需要索引,但是当范围是header时,您需要指定哪个头。

请注意,并非所有范围都适用于所有情况。请参阅元素的描述以获取适用范围的列表。

  • originalUrl:原始请求的完整URL,无论已执行任何重写操作。ASP的工作方式意味着将剥去http://domain部分,并在路径的开头以/开头。您只能阅读此范围,原始请求不能通过设计进行修改。
  • originalPath:只是原始请求的路径部分,不包括查询字符串。路径以域名后的/开头,以?前的最后一个字符结尾。如果有一个或其余网址,则没有?。您只能阅读此范围,原始请求不能通过设计进行修改。
  • originalQueryString:只是原始请求的查询字符串部分。查询字符串以第一个? 并继续到网址末尾。您只能阅读此范围,原始请求不能通过设计进行修改。
  • originalPathElement:路径中的一个元素。使用与范围相关联的索引来指定要从中读取路径的元素。索引值为0表示整个路径,并且等效于路径范围。索引的正整数将引用路径中从左到右的元素,无论url是否以/开头,第一个元素始终为1。负整数将从右到左引用路径的元素,最后一个元素始终为-1,无论路径是否带有尾随/。(ME:这个和originalUrl之间是什么关系?)
  • originalParameter:来自原始请求的查询字符串部分的参数值。在与范围关联的索引中指定参数的名称。网址的查询字符串部分以?开头。查询字符串中的参数用&符号分隔。每个参数的形式均为名称=值。名称和值必须在url中编码,因为它们不能包含对url具有特殊含义的字符。Url Rewrite模块将为您解码这些内容,以便您可以使用规则中的未编码值。
  • originalHeader:来自原始请求的header之一。在与范围关联的索引中传递header的名称。Headers从浏览器传递到URL下方和请求正文上方的单独行上的IIS。使用浏览器时,用户无法直接指定headers,它们将由浏览器自动插入,并包含有关浏览器的信息。有关headers的列表及其含义,请参见https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html,通过这个rfc,可以了解更多关于header的信息:
  • originalServerVariable:这些变量不是来自浏览器,也不属于请求。这些是IIS使您的软件可以使用的值,并且它们包含有关IIS环境的信息。有关完整列表,请访问http://www.w3schools.com/asp/coll_servervariables.asp。在作用域索引中指定服务器变量的名称。
  • url:将传递给其余请求处理管道的路径和查询字符串。对于任何接收到此请求的处理程序,它将显示为好像用户在其浏览器中键入的URL。您可以通过修改此范围来修改整个url,或者可以使用其他范围来修改url的特定部分,这些更改将在此处反映出来。例如,如果您覆盖pathElement,然后引用url,则对该URL读回的值将包括path元素修改。请注意,您不能通过更改此范围来设置方法和主机名,只能更改路径和查询字符串。
  • path:只是url范围的路径部分,不包括查询字符串。您对路径所做的任何更改都不会影响查询字符串。如果删除该路径,它将设置为/
  • queryString:只是url范围的查询字符串部分,包括前导?。您对queryString所做的任何更改都不会影响路径。
  • pathElement:路径范围中的一个元素。为范围索引传递一个数字(有关详细信息,请参见上面的originalPathElement)。请注意,pathElement范围的插入将在路径中插入一个新元素,而append将在当前路径元素文本的末尾附加文本。
  • parameter:queryString范围中一个参数的值。在与范围关联的索引中传递一个参数名称。您可以rewrite,delete和keep查询字符串参数。如果您append,则将查询字符串参数文本添加到参数值的末尾
  • header:originalHeader范围的修改版本。可以通过rewrite,delete和keep操作进行修改。如果append header,则文本将添加到header值的末尾
  • serverVariable:originalServerVariable范围的修改版本。更改这些变量只会影响当前请求。
  • literal:指定此范围可让您提供硬编码的文字值,而不是从请求中读取值。文字值在范围索引中传递。许多操作都有一个value属性,这是指定文字范围的一种简便方法。
  • matchGroup:最后一个match元素中与请求匹配的组之一。索引0是整个匹配项,索引1是匹配组1等。这等效于{r:n}语法,但更具可读性。要使用此功能,请在match中使用正则表达式,并使用()标识匹配组。
  • conditionGroup:最后一个condition元素中与请求匹配的组之一。只有使用正则表达式语法的条件才能生成匹配组。指定索引0以匹配整个匹配字符串,索引1为匹配组1,依此类推。这等效于{c:n}语法,但更具可读性。要使用此功能,请在condition中使用正则表达式,并使用()标识匹配组。默认情况下,每个匹配条件将替换所有匹配组。您可以通过设置父conditions元素的trackAllCaptures属性来更改此设置。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 changyandou 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Microsoft Rewrite
  • 2.UrlRewrite.NET
    • Syntax Reference 语法参考
      • rewrite
      • rules
      • rewriteMaps
      • rewriteMap
      • rewriteMap->add
      • assembly
      • class
      • rule
      • conditions
      • condition
      • normalize
      • action
      • rewrite【这个应该是主要部分】
      • append
      • insert
      • delete
      • keep
      • match
      • scopes
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档