IIS重写模块 - 如何重定向维护路径和查询字符串,但添加额外的查询字符串参数?

问题描述:

我一直在撞墙,试图让一些IIS重定向规则正常工作。我在Stack Overflow和IIS.net上搜索和阅读了这些东西,但它根本不起作用。IIS重写模块 - 如何重定向维护路径和查询字符串,但添加额外的查询字符串参数?

我想它在我的本地(实际)IIS,我已经安装了重写2.0模块,并尝试做了修复安装就可以了。我在管理员cmd系列上做了一次iisreset,比我提到的还要多。

在我的hosts文件中,我为URL my.test.com设置了127.0.0.1。

我要实现的是给一个子域网址重定向到主域名URL与一个额外的查询字符串参数,同时保持现有的路径和如果它们存在的查询字符串值是什么。

我设置3个规则如下是在网站的根文件夹:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="PathAndQueryString" enabled="true" stopProcessing="true"> 
       <match url="(/\w*)(\?\w*=\w*)([&amp;\w*=\w*]*)" /> 
       <action type="Redirect" url="https://www.test.com{R:1}{R:2}{R:3}&amp;param=value" appendQueryString="false" /> 
       <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
        <add input="{HTTP_HOST}" pattern="my.test.com" /> 
       </conditions> 
      </rule> 
      <rule name="Querstring" enabled="true" stopProcessing="true"> 
       <match url="(\?\w*=\w*)([&amp;\w*=\w*]*)" /> 
       <action type="Redirect" url="https://www.test.com{R:1}{R:2}&amp;param=value" appendQueryString="false" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="my.test.com" /> 
       </conditions> 
      </rule> 
      <rule name="DomainOnly" enabled="true" stopProcessing="true"> 
       <match url=".*" /> 
       <action type="Redirect" url="https://www.test.com?param=value" appendQueryString="false" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="my.test.com" /> 
       </conditions> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

不幸的是,尽管测试模式和确认{R:X}捕获是正确的,当我尝试测试此使用边缘,Chrome浏览器,火狐浏览器和IE浏览器的所有这些IIS行为像规则不存在。

测试:

无上述测试工作,他们获得服务不重定向。

我也试图把用作匹配URL模式的一部分的状态模式,但它没有用,要么工作;事实上,我在阅读Stack Overflow后将其移到了条件之后,该文章说当规则位于网站的根目录中时,它不包含主机,但仍然没有任何效果。

任何帮助将不胜感激。

UPDATE 1:对于路径和查询字符串规则试图从该图案的那个开始去除加粗部分(/ \ W *)。没有任何影响。

更新2:试图使非常喜怒无常“失败请求跟踪”功能,当它实际上是工作的,它说,没有任何匹配URL模式是匹配的,除了它现在已经开始踢在第三规则重定向,但由于显而易见的原因,不保持路径和其他查询字符串。

UPDATE 3:在Edge和IE上,没有任何规则可以使用。在Chrome和FF上,只有域名重定向似乎正在工作 - 但是如果我禁用域名唯一规则并重新启动IIS,就好像规则仍然存在--FFS给了我力量这个垃圾现在真的开始沸腾我的血液 - 这不应该是那该死的困难。

在我给出答案,在微软喊出毓鼎谁回答这个职位上的IIS的一个副本。网络论坛,并提供了大部分答案。

所以,我们去,如果你想重写规则,从1 URL重定向到另一个维护路径和查询字符串,如果他们存在,同时加上一个硬编码的URL参数与适当的&或?那么这里是你需要的规则。

在规则中,您将从my.test.com重定向到www.test.com,但显然您需要替换下面规则中的这两个URL,并将硬编码参数“ExtraParam = SomeValue”更改为你需要什么。

<system.webServer> 
<rewrite> 
    <rules> 
     <rule name="DomainOnly" enabled="true" stopProcessing="true"> 
      <match url="(.*)" /> 
      <conditions trackAllCaptures="true"> 
       <add input="{HTTP_HOST}" pattern="my.test.com" /> 
       <add input="{REQUEST_URI}" pattern="/.+" negate="true" /> 
      </conditions> 
      <action type="Redirect" url="http://www.test.com?ExtraParam=SomeValue" redirectType="Temporary" /> 
     </rule> 
     <rule name="PathOnly" enabled="true" stopProcessing="true"> 
      <match url="(.*)" /> 
      <conditions trackAllCaptures="true"> 
       <add input="{REQUEST_URI}" pattern="/.+" /> 
       <add input="{REQUEST_URI}" matchType="Pattern" pattern="\?.+" ignoreCase="true" negate="true" /> 
       <add input="{HTTP_HOST}" pattern="my.test.com" /> 
      </conditions> 
      <action type="Redirect" url="http://www.test.com{C:0}?ExtraParam=SomeValue" redirectType="Temporary" /> 
     </rule> 
     <rule name="Querstring" stopProcessing="true"> 
      <match url="(.*)" /> 
      <conditions trackAllCaptures="true"> 
       <add input="{REQUEST_URI}" pattern="/.+" /> 
       <add input="{QUERY_STRING}" pattern=".*" /> 
       <add input="{HTTP_HOST}" pattern="my.test.com" /> 
      </conditions> 
      <action type="Redirect" url="http://www.test.com{C:0}&amp;ExtraParam=SomeValue" appendQueryString="false" redirectType="Temporary" /> 
     </rule> 
    </rules> 
</rewrite> 

在我眼里URL重写2.0模块有一个bug。基本症结在于,你无法在主要匹配模式中匹配任何东西,你必须根据条件做所有事情。因此,你可以为比赛设置一个模式的事实是毫无意义的,因为如果你试图匹配除(。*)之外的任何东西,即匹配任何类似我最初做的事情,它就不会做你想做的事情,扑-砖墙岬。

更令人讨厌的是,在IIS管理器中,这个UI非常无用。你可以测试你的模式 - 我做过了 - 他们会工作,但它真正测试的是regEx模式。

我们真正需要的是在规则层面的测试。换句话说,您输入一个URL,它会告诉您是否有任何规则匹配以及哪些条件通过或失败。是的,如果你启用了失败的请求追踪规则,那么你可以得到这些信息,但是它是一个漫长的过程,可以随意使用和工作(只要清除旧的日志并观察它,然后停止记录,直到关闭它为止;再次)的东西,应该是微不足道的。