使用 IIS URL 重写将内容限制为两个域之一导致重定向循环

Using IIS URL Rewrite to limit content to one of two domains results in redirect loop

我的网站有两个域名,其中一个是无处不在的无 cookie 静态内容域。一个名称只是 "main" 名称的别名(使用 CNAME),因此无需额外配置,任何资源都可以通过任一域访问。出于安全原因,除了希望导航直观之外,我还想确保静态内容并且只有静态内容可通过静态域使用,特别是静态内容不可通过主域使用。

我使用 IIS 的 URL Rewrite 完成了后者,规则如下:

<rule name="StaticContentRes" patternSyntax="ECMAScript" stopProcessing="true">
    <match url=".*" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^maindomain$" />
        <add input="{REQUEST_URI}" pattern="^/res/.*$" />
    </conditions>
    <action type="Redirect" url="https://staticdomain/{R:0}" />
</rule>

这工作得很好,并确保对某些静态内容(全部位于 "res" 目录中)的请求仅通过静态域提供服务。但是,我试图进一步强制静态域仅用于对该目录的请求:

<rule name="RegularContent" patternSyntax="ECMAScript" stopProcessing="true">
    <match url=".*" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTP_HOST}" pattern="^staticdomain$" />
        <add input="{REQUEST_URI}" pattern="^/res/.*$" negate="true" />
    </conditions>
    <action type="Redirect" url="https://maindomain/{R:0}" />
</rule>

添加第二条规则会导致无限重定向循环,无论何时使用任一域为该目录提供服务。我完全被难住了,因为我认为 negate="true" 逻辑非常干净且可行。我该怎么做才能让静态域请求仅在到达 "res" 目录时才通过,而不会引发此循环?

通常情况下,我在发布此问题后立即发现了问题。在第一条规则中使用 stopProcessing="true" 意味着永远不会使用第二条规则,因为第一条规则中的匹配模式会捕获所有内容。我没有意识到在决定请求是否正式匹配规则(为了停止处理的目的)时,没有考虑添加的条件,只是匹配模式。