【问题标题】:Regex find a string within an url, non case sensitive正则表达式在 url 中查找字符串,不区分大小写
【发布时间】:2012-02-24 17:45:46
【问题描述】:

我有网址:

http://primarydomain.com/sites/secondarydomain/?foo=bar

我可以使用什么正则表达式来匹配 sites/secondarydomain 的 url - 不区分大小写(这是针对 web.config 文件中的规则,但需要标准正则表达式)?

为了把它放在上下文中,我正在编写一个 web.config url 重写规则以从所有 url 中删除 sites/secondarydomain(由于多个站点托管在同一个包上)。

<rule name="Remove full hosting path">
    <match url="***Regex goes here***" ignoreCase="true"/>
    <action type="Redirect" url="http://secondary.com/{R:1}" redirectType="Permanent" />
</rule>

我希望仅匹配目录(而不是查询字符串)以重定向用户(因此删除 sites/secondarydomain)。

更新:看起来我想重写 url 而不是重定向,这是当前的 web.config 规则,它不太有效:

    <rule name="TestRule">
      <match url=".*" />
      <conditions>
        <add input="{PATH_INFO}" pattern="^(/hostedsites/clemones_htdocs)(/.*)"/>
      </conditions>
      <action type="Rewrite" url="\{C:2}" appendQueryString="true" />
    </rule>

我的辅助域是http://clemones.com/ 以及我想要摆脱的路径:http://clemones.com/hostedsites/clemones_htdocs/

对于测试,http://clemones.com/shizzle 用作目的地(因此遗憾的是,http://clemones.com/hostedsites/clemones_htdocs/shizzle 也可以使用)。

提前致谢

【问题讨论】:

  • 您的问题似乎有点模棱两可。您是在尝试匹配站点/辅助域和根更改,还是担心最后的查询字符串 ?foo?还是辅助域是需要正则表达式的变化字段?
  • 好的,我想我已经添加了一些说明'辅助域需要正则表达式的变化字段'是正确的。

标签: c# asp.net regex web-config


【解决方案1】:

你试过了吗:

详细地说,这仅将正则表达式应用于路径,而不是根 url:

 <rule name="TestRule">
     <match url=".*" />
     <conditions>
         <add input="{PATH_INFO}" pattern="^(/sites/secondarydomain)(/.*)"/>
     </conditions>
     <action type="Rewrite" url="\{C:2}" appendQueryString="true" />
 </rule>

该条件产生多个组,{C:2} 表示“/sites/secondarydomain/”之后的所有内容,不包括通过选择“appendQueryString=true”附加的查询字符串。

它允许您分解您想要采取行动的部分,所以是的,它与仅将正则表达式应用于整个 url 不同。

这是一篇解释其工作原理的文章: http://weblogs.asp.net/owscott/archive/2010/01/26/iis-url-rewrite-hosting-multiple-domains-under-one-site.aspx

【讨论】:

  • -1。由于字符串的开头和字符串断言的结尾,这将不起作用。除非 web.config 正则表达式解释器有什么特别之处(我对此持怀疑态度)
  • 我已经尝试过了,是的 swannee ...但我想我想要一个接近这个的解决方案 - 我应该使用什么来代替 '^' 字符(在字符串中匹配而不是 at它的开始)?
  • 我已经详细说明了我的回复。是的,它比仅将正则表达式应用于整个 url 更复杂。
  • @Legatou :感谢您恢复我的荣誉! :)
  • @sannee 没问题。实际上,您对我们在谈​​论的内容的了解比我对您的评价还要多,这确实有点尴尬>.>
【解决方案2】:

尝试向后看(?&lt;=(http://primarydomain.com/))[^\b]*

编辑:

如果你想排除查询字符串...(?&lt;=(http://primarydomain.com/))[^?]*

如果您出于任何原因想要更加严格(例如只允许目录中的字母字符),您可以尝试类似(?&lt;=(http://primarydomain.com/))[a-zA-Z/]*[a-zA-Z]

【讨论】:

  • 这看起来不错......但是当我这样尝试时,Visual Studio 对“<match url="(?<=(/hostedsites/clemones_htdocs))[^\b]*" ignoreCase="true"/>
  • 尝试用&amp;amp;替换它
  • 我认为您的意思是尝试将 &amp;lt; 替换为 &amp;lt;
  • 恐怕在转义 '
  • 哈哈哈,是的,&amp;lt; 对于某些人来说一定是一个非常奇怪的错字。我只能说我知道.NET 的正则表达式语法。我不知道 web.config 如何处理正则表达式,甚至不知道 web.config 正在寻找什么。
【解决方案3】:

如果域总是http://primarydomain.com/sites/,那么我会这样攻击它:

匹配 url="http://primarydomain.com/sites/([A-Za-z0-9_]+)/.*";

【讨论】:

  • 如果他想在正则表达式匹配中包含域和查询字符串,你是对的。但这不是他说的;)
【解决方案4】:

lookbehind 和lookahead 的组合将匹配您想要的字符串

(?<=.\w+/)\w+/\w+(?=/.*)

话虽如此,您示例中的{R:1}真的 看起来像一个正则表达式反向引用,所以也许这就是事情没有按预期工作的原因。如果这是真的,您可能需要这样的东西:

.\w+/(\w+/\w+)

从未做过 IIS 重写,所以 YMMV。这两个正则表达式在您到目前为止给出的示例中确实有效(经过测试),以及更通用的 URL,例如:

http://primarydomain.com/hostedsites/clemones_htdocs/index.aspx?foo=bar
http://anydomain.net/sites/secondarydomain/index.aspx?foo=bar
...

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 2016-02-24
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多