我需要一个匹配除特定路径之外的所有https网址的正则表达式。
e.g。
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>
但它不起作用
答案 0 :(得分: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>
答案 1 :(得分:4)
我想出了以下模式:^https://[^/]+(/(?!form/|form$).*)?$
<强>解释强>
^
:匹配字符串的开头https://
:匹配https://
[^/]+
:匹配除正斜杠之外的任何内容一次或多次(
:开始匹配第1组
/
:匹配/
(?!
:负向前瞻
form/
:检查是否没有form/
|
:或form$
:检查字符串末尾是否有form
)
:end negative lookahead .*
:匹配所有内容零次或多次)
:结束匹配组1 ?
:将上一个令牌设为可选$
:匹配行尾答案 2 :(得分:4)
这会为您提供您正在寻找的行为吗?
https?://[^/]+($|/(?!forms)/?.*$)
在www.domain.com
位之后,它正在寻找字符串的结尾,或者斜杠,然后是非forms
的东西。
答案 3 :(得分:3)
我在发布的模式http://[^/]+($|/(?!forms)/?.*$)
它错过了重定向https://domain.com/forms_instructions
等网址,因为该模式也无法匹配。
我相信你在模式和网址之间反转了http和https。该模式应具有https
和网址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部分。