尽管正则表达式有效,但规则在重写规则中不起作用
Rule not working in rewrite rules despite valid regex
我们的 webconfig 文件使用 Url 重写,本质上是将任何 http 流量推送到 https
除了在本地开发外,这工作得很好。有一段时间我们必须简单地记住从 web.config 中注释掉代码并再次取消注释以进行提交。这自然不是一个好的工作方式。
代码简单
<rewrite>
<rules>
<rule name="Redirect-AllWWW-ToSecureNonWWW">
<match url="^((?!local).)*$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?:www\.)(.+)$" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}"/>
</rule>
<rule name="Redirect-AllNonSecure-ToSecureNonWWW-ExcludingLocalhost">
<match url="^((?!local).)*$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
<add input="{HTTPS}" pattern="^off$" />
<add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" />
</rule>
</rules>
</rewrite>
根据 regex101 ,它有效!
https://regex101.com/r/3Mz6w1/1
然而,当在本地主机上时,我仍然被定向到 HTTPS
为什么它在 regex101 中有效,而在我的 web.config 文件中无效
有关
quote from URL Rewrite Module Configuration Reference
A rewrite rule pattern is used to specify a pattern to which the current URL path is compared.
...
A pattern is specified within a <match> element of a rewrite rule.
根据这条官方信息,你必须确定 <match url
仅与 URL paths 进行比较,其中不包含主机名,不是整个URL。
对于Url Rewrite Module,例如URL本题路径为questions/44944175/rule-not-working-in-rewrite-rules-despite-valid-regex
。否 whosebug.com
否 https://
没有查询字符串,只有没有前导斜线的路径。
要忽略对包含 local
的主机名的请求,您需要一些条件来寻找 local
与 HTTP_HOST
header.
的匹配项
<rewrite>
<rules>
<rule name="Redirect-AllWWW-ToSecureNonWWW" stopProcessing="true">
<match url=".*" />
<conditions>
<!-- continue if http host name does not contain "local" -->
<add input="{HTTP_HOST}" pattern="local" negate="true" />
<add input="{HTTP_HOST}" pattern="^(?:www\.)(.+)$" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" />
</rule>
<rule name="Redirect-AllNonSecure-ToSecureNonWWW-ExcludingLocalhost" stopProcessing="true">
<match url=".*" />
<conditions>
<!-- continue if http host name does not contain "local" -->
<add input="{HTTP_HOST}" pattern="local" negate="true" />
<add input="{HTTPS}" pattern="^off$" />
<add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" />
</rule>
</rules>
</rewrite>
我们的 webconfig 文件使用 Url 重写,本质上是将任何 http 流量推送到 https
除了在本地开发外,这工作得很好。有一段时间我们必须简单地记住从 web.config 中注释掉代码并再次取消注释以进行提交。这自然不是一个好的工作方式。
代码简单
<rewrite>
<rules>
<rule name="Redirect-AllWWW-ToSecureNonWWW">
<match url="^((?!local).)*$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(?:www\.)(.+)$" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}"/>
</rule>
<rule name="Redirect-AllNonSecure-ToSecureNonWWW-ExcludingLocalhost">
<match url="^((?!local).)*$" />
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
<add input="{HTTPS}" pattern="^off$" />
<add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" />
</rule>
</rules>
</rewrite>
根据 regex101 ,它有效! https://regex101.com/r/3Mz6w1/1
然而,当在本地主机上时,我仍然被定向到 HTTPS
为什么它在 regex101 中有效,而在我的 web.config 文件中无效
quote from URL Rewrite Module Configuration Reference
A rewrite rule pattern is used to specify a pattern to which the current URL path is compared.
...
A pattern is specified within a <match> element of a rewrite rule.
根据这条官方信息,你必须确定 <match url
仅与 URL paths 进行比较,其中不包含主机名,不是整个URL。
对于Url Rewrite Module,例如URL本题路径为questions/44944175/rule-not-working-in-rewrite-rules-despite-valid-regex
。否 whosebug.com
否 https://
没有查询字符串,只有没有前导斜线的路径。
要忽略对包含 local
的主机名的请求,您需要一些条件来寻找 local
与 HTTP_HOST
header.
<rewrite>
<rules>
<rule name="Redirect-AllWWW-ToSecureNonWWW" stopProcessing="true">
<match url=".*" />
<conditions>
<!-- continue if http host name does not contain "local" -->
<add input="{HTTP_HOST}" pattern="local" negate="true" />
<add input="{HTTP_HOST}" pattern="^(?:www\.)(.+)$" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" />
</rule>
<rule name="Redirect-AllNonSecure-ToSecureNonWWW-ExcludingLocalhost" stopProcessing="true">
<match url=".*" />
<conditions>
<!-- continue if http host name does not contain "local" -->
<add input="{HTTP_HOST}" pattern="local" negate="true" />
<add input="{HTTPS}" pattern="^off$" />
<add input="{HTTP_HOST}" pattern="^(?:www\.)?(.+)" />
</conditions>
<action type="Redirect" url="https://{C:1}/{R:0}" />
</rule>
</rules>
</rewrite>