IIS 重写模块 - 如何重定向维护路径和查询字符串但添加额外的查询字符串参数?
IIS Rewrite module - how to redirect maintaining path and querystring but adding an extra querystring parameter?
我一直在用头撞砖墙试图让一些 IIS 重定向规则起作用。我已经在 Stack Overflow 和 IIS.net 上搜索和阅读了相关内容,但它根本不起作用。
我正在我的本地(真实)IIS 上尝试它,我安装了重写 2.0 模块并尝试对其进行修复安装。我在管理 cmd 行中执行 iisreset 的次数比我想说的还要多。
在我的主机文件中,我为 URL my.test.com.
设置了 127.0.0.1
我想要实现的是给定一个子域 URL 重定向到主域 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} 捕获是正确的,但当我尝试使用 Edge 进行测试时,Chrome、Firefox 和 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
None 以上测试有效,它们在没有重定向的情况下得到服务。
我也试过将条件模式用作匹配 URL 模式的一部分,但它也没有用;事实上,我在阅读 Stack Overflow post 后将其移动到条件,其中说当规则位于网站的根目录时它不包括主机,但仍然没有任何效果。
如有任何帮助,我们将不胜感激。
更新 1: 对于路径和查询字符串规则,尝试从该模式的开头删除粗体部分 (/\w* ).没有任何效果。
更新 2: 尝试启用极其喜怒无常的 "Failed Request Tracing" 功能,当它实际工作时,它说 none of the Match URL 模式是匹配的,除了第三条规则,它现在已经开始启动和重定向,但由于显而易见的原因没有维护路径和其他查询字符串参数。
更新 3: 在 Edge 和 IE 上 none 规则完全有效。在 Chrome 和 FF 上,仅域重定向似乎在工作 - 但是,如果我禁用仅域规则并重新启动 IIS,它就像规则仍然存在一样 - FFS 给我力量,这个废话真的开始沸腾我了现在是血 - 这不应该那么难。
在我给出答案之前,我要感谢 Microsoft 的 Yuk Ding,他在 iis.net 论坛上回复了此 post 的副本并提供了大部分答案。
所以我们开始吧,如果你想重写从 1 URL 重定向到另一个的规则,维护路径和查询字符串(如果它们存在)同时添加硬编码的 URL 参数适当的 & 或 ?那么这里是你需要的规则。
在规则中,您要从 my.test.com 重定向到 www.test.com,但显然您需要替换下面规则中的那 2 个 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 Rewrite 2.0 模块有一个错误。基本的症结是你不能匹配主匹配模式中的任何东西,你必须根据条件做所有事情。因此,您可以为匹配设置模式这一事实是完全没有意义的,因为如果您尝试匹配 (.*) 以外的任何内容,即匹配我最初所做的任何事情,它不会做您想要的,并且会有效地导致头-重击砖墙。
更烦人的是,在 IIS 管理器中,UI 对此毫无帮助。您可以测试您的模式 - 我做了 - 它们会起作用,但它真正测试的只是 regEx 模式。
我们真正需要的是规则层面的测试。换句话说,您输入一个 URL,它会告诉您是否有任何规则匹配以及哪些条件通过或失败。是的,如果您启用了失败的请求跟踪规则,您可以获得此信息,但是启用和以随意的方式工作都是一个冗长的废话(只需尝试清除旧日志并观察它然后停止记录,直到您将其关闭并再次)对于一些应该是微不足道的事情。
我一直在用头撞砖墙试图让一些 IIS 重定向规则起作用。我已经在 Stack Overflow 和 IIS.net 上搜索和阅读了相关内容,但它根本不起作用。
我正在我的本地(真实)IIS 上尝试它,我安装了重写 2.0 模块并尝试对其进行修复安装。我在管理 cmd 行中执行 iisreset 的次数比我想说的还要多。
在我的主机文件中,我为 URL my.test.com.
设置了 127.0.0.1我想要实现的是给定一个子域 URL 重定向到主域 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} 捕获是正确的,但当我尝试使用 Edge 进行测试时,Chrome、Firefox 和 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
None 以上测试有效,它们在没有重定向的情况下得到服务。
我也试过将条件模式用作匹配 URL 模式的一部分,但它也没有用;事实上,我在阅读 Stack Overflow post 后将其移动到条件,其中说当规则位于网站的根目录时它不包括主机,但仍然没有任何效果。
如有任何帮助,我们将不胜感激。
更新 1: 对于路径和查询字符串规则,尝试从该模式的开头删除粗体部分 (/\w* ).没有任何效果。
更新 2: 尝试启用极其喜怒无常的 "Failed Request Tracing" 功能,当它实际工作时,它说 none of the Match URL 模式是匹配的,除了第三条规则,它现在已经开始启动和重定向,但由于显而易见的原因没有维护路径和其他查询字符串参数。
更新 3: 在 Edge 和 IE 上 none 规则完全有效。在 Chrome 和 FF 上,仅域重定向似乎在工作 - 但是,如果我禁用仅域规则并重新启动 IIS,它就像规则仍然存在一样 - FFS 给我力量,这个废话真的开始沸腾我了现在是血 - 这不应该那么难。
在我给出答案之前,我要感谢 Microsoft 的 Yuk Ding,他在 iis.net 论坛上回复了此 post 的副本并提供了大部分答案。
所以我们开始吧,如果你想重写从 1 URL 重定向到另一个的规则,维护路径和查询字符串(如果它们存在)同时添加硬编码的 URL 参数适当的 & 或 ?那么这里是你需要的规则。
在规则中,您要从 my.test.com 重定向到 www.test.com,但显然您需要替换下面规则中的那 2 个 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 Rewrite 2.0 模块有一个错误。基本的症结是你不能匹配主匹配模式中的任何东西,你必须根据条件做所有事情。因此,您可以为匹配设置模式这一事实是完全没有意义的,因为如果您尝试匹配 (.*) 以外的任何内容,即匹配我最初所做的任何事情,它不会做您想要的,并且会有效地导致头-重击砖墙。
更烦人的是,在 IIS 管理器中,UI 对此毫无帮助。您可以测试您的模式 - 我做了 - 它们会起作用,但它真正测试的只是 regEx 模式。
我们真正需要的是规则层面的测试。换句话说,您输入一个 URL,它会告诉您是否有任何规则匹配以及哪些条件通过或失败。是的,如果您启用了失败的请求跟踪规则,您可以获得此信息,但是启用和以随意的方式工作都是一个冗长的废话(只需尝试清除旧日志并观察它然后停止记录,直到您将其关闭并再次)对于一些应该是微不足道的事情。