正则表达式匹配所有https URL,但排除特定路径

8

我需要一个正则表达式,可以匹配所有https URL,但排除特定路径。

例如:

匹配

https://www.domain.com/blog https://www.domain.com

不匹配

https://www.domain.com/forms/*

这是我目前为止的成果:

<rule name="Redirect from HTTPS to HTTP excluding /forms" enabled="true" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{URL}" pattern="^https://[^/]+(/(?!(forms/|forms$)).*)?$" />
    </conditions>
    <action type="Redirect" url="http://{HTTP_HOST}/{R:0}" redirectType="Permanent" />
</rule>

但它不起作用


匹配URL已经被问了数百次。但是让我们忘记搜索重复的内容,请告诉我们你正在使用哪种风格? - HamZa
嗨,Hamza,我尝试找到一个符合我的要求的正则表达式,但是没有找到。我正在使用IIS URL重写模块。规则是匹配所有内容,除了某些特定的内容,这是棘手的部分。如果你能帮忙,那就太好了,这会让我多睡几个小时。这个链接让我接近目标,但还不够完美:https://dev59.com/6UzSa4cB1Zd3GeqPiwXr?rq=1 - Burt
什么应该精确地阻止匹配,非有效URL的规则是什么? - Ibrahim Najjar
我想捕获所有的https流量并将其重定向到http,除非https网址是http://www.domain.com/forms/*。 - Burt
你的条件似乎有误,你的模式写成了“http?”而不是“https”。也许这就是问题所在? - Sundar R
感谢大家的回答,非常感谢帮助。 - Burt
4个回答

5
重定向模块的工作方式是,您应该简单地使用以下内容:
<rule name="Redirect from HTTPS to HTTP excluding /forms" stopProcessing="true">
    <match url="^forms/?" negate="true" />
    <conditions>
        <add input="{HTTPS}" pattern="^ON$" />
    </conditions>
    <action type="Redirect" url="http://{HTTP_HOST}/{R:0}" />
</rule>

规则只有在请求为HTTPS,并且路径不是以forms/forms开头(使用negate="true"选项)时才会触发重定向到HTTP。
您还可以添加一个条件来匹配主机为www.example.com,如下所示:
<rule name="Redirect from HTTPS to HTTP excluding /forms" stopProcessing="true">
    <match url="^forms/?" negate="true" />
    <conditions>
        <add input="{HTTPS}" pattern="^ON$" />
        <add input="{HTTP_HOST}" pattern="^www.example.com$" />
    </conditions>
    <action type="Redirect" url="http://{HTTP_HOST}/{R:0}" />
</rule>

5
我提出了以下模式:^https://[^/]+(/(?!form/|form$).*)?$ 解释:
  • ^: 匹配字符串的开始
  • https://: 匹配 https://
  • [^/]+: 匹配任何字符,但不包括正斜杠,一次或多次
  • (: 开始匹配第一个组
    • /: 匹配 /
    • (?!: 负向先行断言
      • form/: 检查是否没有 form/
      • |: 或
      • form$: 检查字符串末尾是否没有 form
    • ): 结束负向先行断言
    • .*: 匹配任何字符,零次或多次
  • ): 结束第一个组的匹配
  • ?: 使前一个标记变为可选项
  • $: 匹配行结束符号

1
@Sniffer 你在哪里以及如何测试它的? - HamZa
我使用Expresso进行了测试,并提供了一个不应匹配的URL作为输入,但Expresso却说它是有效的。 - Ibrahim Najjar
这真的很奇怪,因为我测试了其他答案的正则表达式,它们都可以工作,但是你的不能。 - Ibrahim Najjar
尽管问题中的正则表达式使用了“https?”,但我认为 OP 不希望匹配 http 的 ? 行为,因为他明确指出“匹配所有 https URL”。可能需要在那里删除问号。 - Sundar R
1
@Burt 很简单,只需删除 ? :p - HamZa
显示剩余3条评论

5
这能给您想要的行为吗?
www.domain.com之后,它要么寻找字符串末尾,要么寻找斜杠,然后是不是forms的内容。

3
我看到这个模式中存在两个问题:http://[^/]+($|/(?!forms)/?.*$)
  • 它无法重定向网址,例如https://domain.com/forms_instructions,因为该模式无法匹配这些网址。

  • 我认为您在模式和URL之间颠倒了http和https。模式应该有https,而URL应该是http

也许这样可以按照您的意愿工作:

 <rule name="Redirect from HTTPS to HTTP excluding /forms" enabled="true" stopProcessing="true">
        <match url="^https://[^/]+(/(?!(forms/|forms$)).*)?$" />
        <action type="Redirect" url="http://{HTTP_HOST}{R:1}" redirectType="Permanent" />
    </rule>

编辑:由于使用.*匹配所有内容,然后再使用额外条件似乎是不必要的,所以我已将模式移动到了标签本身。我还更改了重定向URL,使用在匹配中括号捕获的输入URL部分。


谢谢Sundar,它似乎仍然无法工作,我认为它非常接近,只是不确定为什么它无法捕获我的域名根目录(https://www.domain.com)并将其重定向到HTTP等效项。 - Burt
@Burt,你的意思是它在除了根域名.com之外的所有页面上都有效吗?如果是这样,我会感到惊讶的,因为前面重定向URL中的{R:0}应该会搞砸一些东西,如果我理解正确的话。我已经更新了帖子,并进行了一些更改,请尝试这个版本。 - Sundar R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接