301 重定向正则表达式模式
Posted
技术标签:
【中文标题】301 重定向正则表达式模式【英文标题】:301 Redirect Regex Pattern 【发布时间】:2020-10-14 12:16:27 【问题描述】:我正在尝试制定一个 IIS 重定向规则来从这个 url 模式重定向,但它打败了我:
https://www.mycompanyPLC.com/en/lorem/ipsum/whatever
到
https://www.mycompanyLTD.com/lorem/ipsum/whatever
基本上我需要用LTD替换PLC,如果url中有“/en/”组,则必须将其删除。
【问题讨论】:
\en\
是否总是在 .com
之后?
@Mandy8055 对于这条规则,是的。在另一种情况下“/en/”不存在,但我正在为这种情况创建另一个规则。
我喜欢你的回答,全面且解释清楚。
@Mandy8055 如果你能看看这个:***.com/questions/62579295/…我将不胜感激。
您是否尝试过使用我在回答中建议的正则表达式?如果你愿意,它肯定会奏效。
【参考方案1】:
在讲授 Regex 几个小时后,我创建了这个规则并且似乎正在工作(我已经测试了几个场景):
^(http|https)://?(www.)mycompanyPLC.com/en?(.*)
来自 IIS 的重定向 URL 是:
https://www.mycompanyLTD.com/R:3
后期编辑:
IIS中的规则是这样的:
<rule name="Replace PLC with LTD and remove /en/" enabled="true" stopProcessing="true">
<match url="(.*?)PLC\.com(?:\/\ben\b)?(.*)" />
<conditions logicalGrouping="MatchAny" trackAllCaptures="false" />
<action type="Redirect" url="R:1ltd.comR:2" />
</rule>
测试网址是这种格式:
http://webdev.myCompanyplc.com/en/our-experience/retail
R:1 = http://webdev.myCompany
R:2 = /our-experience/retail
正则表达式没问题,但重定向仍然无效
【讨论】:
你用过大小写无关模式吗?即-i
标志?因为PLC
区分大小写,并且在您的示例中您使用的是plc
。类似ignoreCase="true"
【参考方案2】:
请参考以下网址规则。
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="en(.*)" />
<action type="Redirect" url="https://www.mycompanyLTD.comR:1" />
</rule>
</rules>
</rewrite>
</system.webServer>
无需强制匹配/en
URL 片段。只要我们发现我们有一个/en
URL 段,我们就会重定向请求。 http/https
URL 段也是如此。
如果有什么我可以帮忙的,请随时告诉我。
【讨论】:
你能看看这个话题吗:***.com/questions/62579295/… ?【参考方案3】:您可以使用/en/
前面带有.com
的单个正则表达式来满足您的这两个要求。比如:
(.*?)PLC\.com(?:\/\ben\b)?(.*)
上述正则表达式的解释:
(.*?)
- 代表第一个捕获组捕获PLC
之前的所有内容lazily。
PLC\.com
- 从字面上匹配 PLC.com
。
(?:\/\ben\b)?
- 表示匹配 \en
字面上零次或一次的非捕获组。 \b
代表word boundary.
(.*)
- 表示第二个捕获组匹配\en
之后的所有内容贪婪。
$1LTD.com$2
- 对于替换(或本例中的重定向)部分,您可以使用此字符串,其中$1
代表第一个捕获的组,$2
代表第二个捕获的组。在你的情况下;你可以使用R:1LTD.comR:2
。
你可以在here.找到上述正则表达式的demo
【讨论】:
以上是关于301 重定向正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章