如果我在我的 Web.config 文件中使用httpRedirect
and rewrite
,我如何指定哪个规则优先?
例如,假设我有一个通用的 catch all 规则,例如wildcard="*"
,但也有一个wildcard="/news" destination="/new/news"
,似乎只有wildcard="*"
规则被执行。
可以从 Apache 获得这种行为;我想在 IIS 中一定有办法。
优先级与它们指定的顺序相同。IIS 管理器有一个“上移”和“下移”按钮,可以为您重新排序它们。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rule1" stopProcessing="true">
<match url="^foo/?bar=123"/>
<action type="Rewrite" url="foo.aspx?bar=special" appendQueryString="false" />
</rule>
<rule name="Rule2" stopProcessing="true">
<match url="^foo/?bar=([A-z0-9]+)"/>
<action type="Rewrite" url="foo.aspx?bar={R:1}" appendQueryString="false" />
</rule>
<rule name="Rule3" stopProcessing="true">
<match url="^foo/"/>
<action type="Rewrite" url="somethingElse.aspx" appendQueryString="false" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
考虑一个传入的请求/foo?bar=123
。
在此示例中,因为Rule1
is first,这意味着请求将被重写为foo.aspx?bar=special
而不是foo.aspx?bar=123
,即使它同时匹配Rule1
、Rule2
和Rule3
。
该stopProcessing="true"
属性确保不执行其他匹配规则(即Rule2
and Rule3
)。
IIS 中的每个配置级别都可以定义零个或多个重写规则。规则的评估顺序与它们指定的顺序相同。URL 重写模块使用以下算法处理规则集:
- 首先,URL 与规则的模式相匹配。如果不匹配,则 URL 重写模块立即停止处理该规则,并继续处理下一条规则。
- 如果模式匹配并且该规则没有条件,则 URL 重写模块执行为此规则指定的操作,然后继续执行下一条规则,在该规则中它使用替换的 URL 作为该规则的输入。
- 如果模式匹配并且规则存在条件,则 URL 重写模块会评估条件。如果评估成功,则执行指定的规则动作,然后将重写的 URL 作为后续规则的输入
这救了我的培根: