IIS URL 重写模块规范 Link 仅当没有子域时

IIS URL Rewrite Module Canonical Link Only If No Subdomain

我在 Windows 2012 服务器上使用 IIS URL 重写模块。如果缺少子域(或 'example.com' 上的完全匹配),我只想添加规范的 www 规则。

问题是 IIS 创建的现成规范重写规则将所有子域的所有流量 (*) 重写到 www。

 <rule name="CanonicalHostNameRule1">
 <match url="(.*)" />
   <conditions>
      <add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
   </conditions>
   <action type="Redirect" url="http://www.example.com/{R:1}" />
 </rule>

问题是我在一个站点下有多个子域/应用程序(因此有一个 web.config)。

我要

example.com

www.example.com

但要单独保留这些和任何其他子域:

secure.example.com

profile.example.com

我需要更具体的匹配正则表达式或模式吗?

更具体地说,安全子域使用https和更好的加密证书。

这个正则表达式更好:

^(w{3}\.)?\w+\.com/

这个正则表达式可以让您选择 url 有无 www。和末尾的 /,但仍然不会计算子域。

您正在寻找一切不是 www.example.com。这包括所有其他子域。

让我们看看你的情况:

 <add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
  • 如果www.example.com进来 --> match = true --> 取反 --> false --> 什么都没有改变(如你所愿)

  • 如果 example.com 进来 --> match = false --> 否定 --> true --> URL 被重定向(如你所愿)

  • 如果 foo.example.com 进来 --> match = false --> 否定 --> true --> URL 被重定向(因为你不想要)

要解决此问题,请尝试以下配置:

<rule name="Redirect to www" stopProcessing="true">
    <match url="(.*)" />
    <conditions trackAllCaptures="true">
       <add input="{CACHE_URL}" pattern="^(.+)://" />
       <add input="{HTTP_HOST}" pattern="^example\.com$" />
    </conditions>
    <action type="Redirect" url="{C:1}://www.example.com/{R:1}" />
</rule>

C:1 部分用于协议(httphttps)。

找到 here.