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*)([&\w*=\w*]*)" />
<action type="Redirect" url="https://www.test.com{R:1}{R:2}{R:3}&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*)([&\w*=\w*]*)" />
<action type="Redirect" url="https://www.test.com{R:1}{R:2}&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行为像规则不存在。
测试:
- https://my.test.com >>https://www.test.com?param=value
- https://my.test.com/SomePath >>https://www.test.com/SomePath
- https://my.test.com/SomePath?AParam=AValue >> https://www.test.com/SomePath?AParam=AValue¶m=value
无上述测试工作,他们获得服务不重定向。
我也试图把用作匹配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}&ExtraParam=SomeValue" appendQueryString="false" redirectType="Temporary" />
</rule>
</rules>
</rewrite>
在我眼里URL重写2.0模块有一个bug。基本症结在于,你无法在主要匹配模式中匹配任何东西,你必须根据条件做所有事情。因此,你可以为比赛设置一个模式的事实是毫无意义的,因为如果你试图匹配除(。*)之外的任何东西,即匹配任何类似我最初做的事情,它就不会做你想做的事情,扑-砖墙岬。
更令人讨厌的是,在IIS管理器中,这个UI非常无用。你可以测试你的模式 - 我做过了 - 他们会工作,但它真正测试的是regEx模式。
我们真正需要的是在规则层面的测试。换句话说,您输入一个URL,它会告诉您是否有任何规则匹配以及哪些条件通过或失败。是的,如果你启用了失败的请求追踪规则,那么你可以得到这些信息,但是它是一个漫长的过程,可以随意使用和工作(只要清除旧的日志并观察它,然后停止记录,直到关闭它为止;再次)的东西,应该是微不足道的。