对于指向同一物理路径的多个站点,IIS 301 将非 www 重定向到 www。正则表达式

IIS 301 redirect non-www to www for multple sites pointed at same physical path. Regex

我在 IIS 中设置了多个站点,它们指向硬盘驱动器上的相同物理结构,即所有站点只有一个 Web 配置文件。

我需要将所有网站的所有非 www 流量重定向到 www。

例如,IIS url 重写中的这种情况适用于单个域,但它不适用于我,因为必须指定域名:

Input: {HTTP_HOST}
Type: Matches the Pattern
Pattern: ^domain.com$

Redirect URL: http://www.domain.com/{R:1}
Redirect Type: Permanent 301

所以理想情况下我需要两种正则表达式模式,一种用于匹配所有域的模式(这些是 .co.uk、.com、.uk.com 等的混合),另一种用于重定向用于重定向 URL.

它还需要为 https://

工作

谁能帮忙,非常感谢所有的建议?

不能直接用正则匹配,因为正则只作用于路径,不包括主机(域名):Accessing URL Parts from a Rewrite Rule.

如果您需要在主机名上包含条件,则需要在规则中添加 <condition>

The <host> is available in the server variable HTTP_HOST and can be accessed by using a condition within a rule.

条件的定义如此处as explained here

最后,您可以使用与引用路径中的正则表达式匹配类似的方式引用条件,但使用语法 {C:1}{R:1}.

有关如何操作的最终线索,see this。基本上你必须根据你的具体情况调整这个规则:

<rule name="Rewrite subdomain">
   <match url="^(.+)" > 
   <!-- rule back-reference is captured here -->
   <conditions>
     <add input="{HTTP_HOST}" type="Pattern"
          pattern="^([^.]+)\.mysite\.com$">
     <!-- condition back-reference is captured here -->
   </conditions>
   <action type="Rewrite" url="{C:1}/{R:1}" />
   <!-- rewrite action uses back-references to condition and 
        to rule when rewriting the url -->
</rule>

哟只需要做两个简单的改变:

  • 修改条件模式以仅捕获 non-www 主机名。此正则表达式:(^(?!www\.).*$) 将捕获所有不以 "www."
  • 开头的主机名
  • 重写 url 包括缺失的 www. 在这种情况下,使用:url="www.{C:1}/{R:1}"

注意:此规则进行了重写。您可以改用重定向,而不是允许此规则之后的其他规则执行重定向

注意 2:您需要创建两个不同的规则来以类似的方式处理 http 和 https。它们在 {HTTPS} 服务器变量上,可以是 "on""off"。在每个规则中,您应该包括操作 url="http://www.{C:1}/{R:1}"url="https://www.{C:1}/{R:1}"