Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Url IIS 10-如何实现重写路径的规则(…一点…)_Url_Iis_Url Rewriting_Iis 10 - Fatal编程技术网

Url IIS 10-如何实现重写路径的规则(…一点…)

Url IIS 10-如何实现重写路径的规则(…一点…),url,iis,url-rewriting,iis-10,Url,Iis,Url Rewriting,Iis 10,使用IIS应用程序请求路由,我们将把请求代理到一个prepod服务器,该服务器为我们的开发、测试、qa和阶段环境托管服务。所有这些都是由于第三方软件的许可证问题,所以我们不能有单独的服务器和公共环境。因此,我们将在Prepod服务器上使用不同的端口和名称实现“相同”的站点/服务-前缀为环境 MyServiceTest/mycode.svc MyServiceQA/mycode.svc MyServiceStage/mycode.svc 但是,另外,我们在pr环境中也有不同的DNS别名,所以我

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

  • MyServiceTest/mycode.svc
  • MyServiceQA/mycode.svc
  • MyServiceStage/mycode.svc
但是,另外,我们在pr环境中也有不同的DNS别名,所以我计划让服务的客户端访问这样的环境

  • myalias.test.mycorp.com/MyService/mycode.svc
  • myalias.qa.mycorp.com/MyService/mycode.svc
问题是,如何使用URL重写模块创建一个操作,将环境前缀添加到路径的第一部分,然后保留其余部分?到服务器场的典型操作路由具有在路径上传递的参数

/{R:0}

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

明白了,不完全完美,但至少是一个可行的解决方案。阅读问题的答案后,我意识到即使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/添加任何内容,但该规则仍然有效。但是,现在我只发现我可以在条件中使用通配符,所以我们可以接受它

当您为匹配URL启用正则表达式时,它将同时适用于条件模式

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

无论QA测试阶段如何,此规则都将重写为后端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>   


如果你改进正则表达式,答案当然是肯定的。不完全正确,因为条件不使用regex:-)“条件不使用regex”是错误的。它可能是regex的一个变体,但IIS至少在“正则表达式”和“通配符”方面非常清楚,所以请原谅我的法语回答确实为我解决了这个问题,在创建农场的脚本中做了更多的调整,但是这个答案是我从一开始就看到的。谢谢