IIS 重写规则 - 忽略本地主机
IIS Rewrite rule - ignore for localhost
我有以下规则,可以很好地将我的 www 请求重定向到根目录。
但是我似乎无法为本地主机关闭它。这是我现在拥有的:
<rule name="CanonicalHostNameRule1">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example\.com$" negate="true" />
</conditions>
<action type="Redirect" url="https://example.com/{R:1}" />
</rule>
我尝试了很多东西,包括:
<rule name="CanonicalHostNameRule1">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
<add input="{HTTP_HOST}" pattern="^example\.com$" negate="true" />
</conditions>
<action type="Redirect" url="https://example.com/{R:1}" />
</rule>
你能帮忙吗?正则表达式是我的弱点唉
如何使用条件仅匹配以 www.
开头的请求,而不是在您不想应用规则时尝试否定?这避免了否定 localhost
的需要,因为 localhost
在条件中永远不匹配:
<rule name="Strip WWW" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)" />
</conditions>
<action type="Redirect" url="https://{C:1}/{URL}" />
</rule>
但是,您尝试的规则示例(您的第二个代码块)也适用于我在 Windows 10 VM 上使用 IIS 进行测试。我可以浏览到 localhost
而无需重定向。也许这里还有另一个问题。
我不会混合不同托管环境的规则; localhost(用于本地开发)和 www,您的实时环境。
如果将它们分开,则不必根据环境启用和禁用规则。
rules
部分有一个 configSource
属性,您可以通过它指向另一个单独的文件,例如。 RewriteRules.config
。
这样做,web.config
将如下所示。
<configuration>
<!-- Other settings go here. -->
<system.webServer>
<!-- other settings go here --->
<rewrite>
<rules configSource="RewriteRules.config">
</rewrite>
</system.webServer>
</configuration>
RewriteRules.config
文件包含规则。
<rules>
<rule name="CanonicalHostNameRule1">
<!-- Rule details go here -->
</rule>
</rules>
您为每个环境制作此 RewriteRules.config
文件的单独版本,仅包含适当的规则并将其部署到相关的网络服务器。
这有很多好处。
- 只评估相关环境的规则,这对性能更好。
- 如果您有其他环境,例如 QA (http://qa. ...) and dev (http://dev. ...),它会更灵活。
- 您不必担心(和测试)一个环境的规则是否会干扰另一个环境的规则,这里:本地 vs 现场。
RewriteRules.config
文件的部署可以包含在部署自动化中。
我有以下规则,可以很好地将我的 www 请求重定向到根目录。
但是我似乎无法为本地主机关闭它。这是我现在拥有的:
<rule name="CanonicalHostNameRule1">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example\.com$" negate="true" />
</conditions>
<action type="Redirect" url="https://example.com/{R:1}" />
</rule>
我尝试了很多东西,包括:
<rule name="CanonicalHostNameRule1">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^localhost$" negate="true" />
<add input="{HTTP_HOST}" pattern="^example\.com$" negate="true" />
</conditions>
<action type="Redirect" url="https://example.com/{R:1}" />
</rule>
你能帮忙吗?正则表达式是我的弱点唉
如何使用条件仅匹配以 www.
开头的请求,而不是在您不想应用规则时尝试否定?这避免了否定 localhost
的需要,因为 localhost
在条件中永远不匹配:
<rule name="Strip WWW" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)" />
</conditions>
<action type="Redirect" url="https://{C:1}/{URL}" />
</rule>
但是,您尝试的规则示例(您的第二个代码块)也适用于我在 Windows 10 VM 上使用 IIS 进行测试。我可以浏览到 localhost
而无需重定向。也许这里还有另一个问题。
我不会混合不同托管环境的规则; localhost(用于本地开发)和 www,您的实时环境。 如果将它们分开,则不必根据环境启用和禁用规则。
rules
部分有一个 configSource
属性,您可以通过它指向另一个单独的文件,例如。 RewriteRules.config
。
这样做,web.config
将如下所示。
<configuration>
<!-- Other settings go here. -->
<system.webServer>
<!-- other settings go here --->
<rewrite>
<rules configSource="RewriteRules.config">
</rewrite>
</system.webServer>
</configuration>
RewriteRules.config
文件包含规则。
<rules>
<rule name="CanonicalHostNameRule1">
<!-- Rule details go here -->
</rule>
</rules>
您为每个环境制作此 RewriteRules.config
文件的单独版本,仅包含适当的规则并将其部署到相关的网络服务器。
这有很多好处。
- 只评估相关环境的规则,这对性能更好。
- 如果您有其他环境,例如 QA (http://qa. ...) and dev (http://dev. ...),它会更灵活。
- 您不必担心(和测试)一个环境的规则是否会干扰另一个环境的规则,这里:本地 vs 现场。
RewriteRules.config
文件的部署可以包含在部署自动化中。