IIS Url 将正则表达式反向引用重写为未知数量的匹配项

IIS Url Rewrite Regex Backreference to unknown number of matches

我的正则表达式技能有限,但我设法想出了一个似乎与我想要的匹配的表达式,但我遇到的问题是使用我的表达式的匹配部分。

规则如下:

<rule name="FixDestinationCategories" stopProcessing="false">
    <match url="^([^\/]+\/){2,4}category/([^\/]+\/){2}/?$" />
    <action type="Redirect" appendQueryString="true" redirectType="Permanent" url="{R:1}" />
</rule>

一个示例 url 可能如下所示:

country/destinations/itineraries/itinerary/category/region/country/
another/directory/category/region/country/

由于网站上的问题,我正在尝试 301 重定向网站上的链接以删除 url 的最后 3 个片段。之前的段数可以在 2 到 4 之间变化。我想要做的是获取 /category/region/country/ 之前的整个路径,我还需要确保生成的路径以尾部斜杠结尾,以便上面的重定向例子最终会是:

country/destinations/itineraries/itinerary/
another/directory/

但是,目前我的重定向 urls 最终是:

itinerary/
directory/

我已经做了很多搜索来寻找解决方案,但在这种情况下,我什至不确定我是否知道用于我的搜索的术语,因为我读到的关于反向引用的大部分内容似乎都是处理单一的比赛。

您需要使第一个和第二个捕获组成为非捕获组,并将第一个组及其量词与捕获组包装起来:

^((?:[^/]+/){2,4})category/(?:[^/]+/){2}/?$
 ^^^^            ^          ^^

regex demo

((?:[^/]+/){2,4}) 是 ID 为 1 的捕获组,它匹配 2、3 或 4 个连续出现的 1+ 个字符,而不是 /,然后是 /(之后的?:形成一个non-capturing group,只用于对一系列模式进行分组,不在内存中存储子匹配,找到匹配后不能引用其内容。

那些绿色突出显示的部分是捕获到第 1 组的子字符串,{R:1} 占位符是指: