IIS 10 - 如何实现重写路径的规则(......有点......)

IIS 10 - How to implement a rule that rewrites the path (...a bit...)

使用 IIS 应用程序请求路由,我们将代理请求到我们的开发、测试、质量保证和阶段环境的预生产服务器托管服务。所有这一切都是由于第三方软件的许可证问题,所以我们不能有单独的服务器 pr。环境。因此,我们将在具有不同端口和名称的预生产服务器上实现 "same" site/service - 前缀为环境。

但是,除此之外我们还有不同的 DNS 别名 pr 环境,所以我计划让服务的客户端访问这样的环境

问题是,如何使用 URL 重写模块创建一个将环境前缀添加到路径的第一部分,然后保留其余部分的操作?路由到 serverfarm 的典型动作具有传递路径

的参数
/{R:0}

但是如上所述我需要"sneak"把环境拍到第一部分。这可行吗?

知道了,虽然不完全完美,但至少是一个可行的解决方案。阅读问题 "Capture the back-reference in the content URLs" posted on forums.iis.net 的答案后,我意识到即使 IIS 上的条件不使用正则表达式,我也可以创建捕获组。每个 '*' 都会创建一个捕获组,然后 "hardcoding" url (没问题,因为我编写了所有规则)并添加 {c:2}

<rule name="ARR_MyService-8052_lb" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
    <add input="{HTTP_HOST}" pattern="myalias-test.mycorp.com" />
    <add input="{REQUEST_URI}" pattern="/MyService*/*" />
</conditions>
<serverVariables></serverVariables>
<action type="Rewrite" url="http://myalias-test.mycorp.com-8052/MyServiceTest/{C:2}" />

我所说的不完全完美是指由于它使用通配符,您可以将任何内容添加到 /MyService/ 并且规则仍然有效。但是,目前我只发现我可以在条件中使用通配符,所以 - 可以接受。

当您为匹配URL启用正则表达式时,它将同时对条件模式起作用。

请将 patternSyntax 从通配符修改为 ECMAScript。

无论 QA TEST STAGE 到后端 MyServiceTest/*.

,此规则都会重写
              <rule name="ARR_MyService-8052_lb" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.*)" />
<conditions trackAllCaptures="false">
                        <add input="{HTTP_HOST}" pattern="myalias-test.mycorp.com" />
                        <add input="{REQUEST_URI}" pattern="/MyService(Test|QA|Stage)/(.*)" />
</conditions>
<serverVariables></serverVariables>
<action type="Rewrite" url="http://myalias-test.mycorp.com-8052/MyServiceTest/{C:2}" />
  </rule>  

如果要将MyServiceTest映射到后端MyServiceTest,将MyServiceQA映射到后端MyServiceQA。

那你可以试试这个

  <rule name="ARR_MyService-8052_lb" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
<match url="(.*)" />
<conditions trackAllCaptures="false">
                        <add input="{HTTP_HOST}" pattern="myalias-test.mycorp.com" />
                        <add input="{REQUEST_URI}" pattern="/MyService(Test|QA|Stage)/(.*)" />
</conditions>
<serverVariables></serverVariables>
<action type="Rewrite" url="http://myalias-test.mycorp.com-8052/MyServiceTest{C:1}/{C:2}" />
  </rule>