【问题标题】:IIS 10 - How to implement a rule that rewrites the path (...a bit...)IIS 10 - 如何实现重写路径的规则(......有点......)
【发布时间】:2023-04-09 10:39:01
【问题描述】:

使用 IIS 应用程序请求路由,我们将请求代理到 preprod-server 托管服务,用于我们的开发、测试、qa 和阶段环境。所有这一切都是由于第 3 方软件的许可证问题,所以我们不能有单独的服务器 pr。环境。因此,我们将在具有不同端口和名称的 preprod 服务器上实现“相同”站点/服务 - 以环境为前缀。

  • MyServiceTest/mycode.svc
  • MyServiceQA/mycode.svc
  • MyServiceStage/mycode.svc

但是,另外我们也有不同的 DNS-aliases pr 环境,所以我的计划是让服务的客户端访问这样的环境

  • myalias.test.mycorp.com/MyService/mycode.svc
  • myalias.qa.mycorp.com/MyService/mycode.svc

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

/{R:0}

但如上所述,我需要将环境“潜入”到 pat 的第一部分。这可行吗?

【问题讨论】:

  • 如果您改进正则表达式,答案当然是肯定的。
  • 不完全正确,因为条件不使用正则表达式:-)
  • “条件不使用正则表达式”是错误的。
  • 好吧,它可能是正则表达式的变体,但 IIS 至少在“正则表达式”与“通配符”方面非常清楚,所以请原谅我的 法语

标签: url iis url-rewriting iis-10


【解决方案1】:

当您为匹配 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>   

【讨论】:

  • 我自己的答案确实为我解决了这个问题,在创建农场的脚本中做了一些调整,但这个答案是我从一开始就在寻找的。谢谢!
【解决方案2】:

知道了,不是完全完美,但至少是一个可行的解决方案。阅读"Capture the back-reference in the content URLs" posted on forums.iis.net 问题的答案后,我意识到即使 IIS 上的条件不使用正则表达式,我也可以创建捕获组。每个 '*' 将创建一个捕获组,然后“硬编码” 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/ 并且该规则仍然有效。但是,现在我只发现我可以在条件中使用通配符,所以 - 可以忍受。

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2020-09-30
    • 2014-06-27
    • 2020-02-17
    • 1970-01-01
    • 2015-08-17
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多