我在Windows 2012服务器上使用IIS URL重写模块。我只想添加一个规范的www规则,如果缺少子域(或者' example.com'上的完全匹配)。
问题是现成的Canonical重写规则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和更好的加密证书。
答案 0 :(得分:0)
这个正则表达式更好:
^(w{3}\.)?\w+\.com/
这个正则表达式将为您提供获取和不使用www的URL的选项。和/在最后,但仍然不会数学子域。
答案 1 :(得分:0)
您正在寻找不是 www.example.com
的所有。这包括所有其他子域。
让我们来看看你的情况:
<add input="{HTTP_HOST}" pattern="^www\.example\.com$" negate="true" />
如果www.example.com
进来 - &gt; match = true - &gt;否定 - &gt; false - &gt;没有任何改变(如你所愿)
如果example.com
进来 - &gt; match = false - &gt;否定 - &gt;是的 - &gt; URL被重定向(如您所愿)
如果foo.example.com
进来 - &gt; match = false - &gt;否定 - &gt;是的 - &gt; 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
部分适用于协议(http
和https
)。
找到here。