IIS7 URL重写 - 添加“www”前缀

28
如何使用IIS7中的URL重写来强制将example.com重定向到www.example.com?应该在web.config中添加什么样的规则?谢谢。

1
将HTTP://mydomain.com/ctrlr/act/val转发到HTTP://www.mydomain.com/ctrlr/act/。 - ax.
为什么必须使用URL重写呢?为什么不能采用传统的方法:创建一个绑定到 example.com 的虚拟主机,然后通过简单的‘HTTP重定向’将其重定向到 http://www.example.com/(使用301状态码,并且不选择‘精确目标’选项,以保持路径不变)。 - bobince
我认为将这种行为包含在应用程序本身中更加合理,而不是创建另一个来支持它。但除此之外可能没有什么区别,或者有吗? - niaher
4个回答

32
为了让它更通用,您可以使用以下URL重写规则,适用于任何域名:

为了使其更加通用,您可以使用以下URL重写规则,适用于任何域名:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
    <rewrite>
        <rules>
              <rule name="Add WWW" stopProcessing="true">
              <match url="^(.*)$" />
              <conditions>
                 <add input="{HTTP_HOST}" pattern="^(?!www\.)(.*)$" />
              </conditions>
              <action type="Redirect" url="http://www.{C:0}{PATH_INFO}" redirectType="Permanent" />
           </rule>
        </rules>
    </rewrite>
</system.webServer>


只要没有子域名,这个程序就能正常工作。 - jpkeisala
why stopProcessing="true"? - serge
@Serge 一个规则可能会被设置为StopProcessing标志。当规则动作被执行(即规则匹配)并且该标志被打开时,这意味着不会再处理后续规则,并且请求将被传递到IIS请求管道。默认情况下,此标志处于关闭状态。 - Atashbahar
打开它的意义是什么?如果您有另一条规则,比如重定向 /*contact* => /contact-us,那么在这种情况下,此规则将不会被处理。 - serge
这会重写 httpS:// 吗? - Clay Nichols

28

这是微软关于URL Rewrite Module 2.0的示例,将*.fabrikam.com重定向到www.fabrikam.com。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Add www" patternSyntax="Wildcard" stopProcessing="true">
                    <match url="*" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="www.fabrikam.com" negate="true" />
                    </conditions>
                    <action type="Redirect" url="http://www.fabrikam.com/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

3
我想补充说明,您可以使用以下代码将其设置为301永久重定向:<action type="Redirect" redirectType="Permanent" url="http://www.fabrikam.com/{R:1}" />。 - Kieran
<action type="Redirect" url="http://www.{HTTP_HOST}/{R:1}" redirectType="Permanent" /> - Alexander Selishchev
如果您想在添加www部分后保留HTTPS协议,则此解决方案非常好- https://weblogs.asp.net/owscott/url-rewrite-protocol-http-https-in-the-action - Ross
1
你如何从规则中排除子域名? - Orion

3

虽然不确定最佳实践是什么,但我有一个网站,其中所有旧域名/子域名都在运行此web.config文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Transfer" stopProcessing="true">
                    <match url=".*" />
                    <action type="Redirect" url="http://www.targetsite.com/{R:0}" redirectType="Permanent" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

看起来完成了工作。


这不会自动重定向到您的服务器上的每个请求吗?如果客户检查其流量,我会期望他们看到每个请求的301。 - LeRoy

0

我不确定这是否有所帮助,但我选择在应用程序级别执行此操作。以下是我编写的一个快速操作过滤器... 只需在项目中添加该类,然后您可以将[RequiresWwww]添加到单个操作或整个控制器。

public class RequiresWww : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpRequestBase req = filterContext.HttpContext.Request;
            HttpResponseBase res = filterContext.HttpContext.Response;

            //IsLocal and IsLoopback i'm not too sure on the differences here, but I have both to eliminate local dev conditions. 
            if (!req.IsLocal && !req.Url.Host.StartsWith("www") && !req.Url.IsLoopback)
            {
                var builder = new UriBuilder(req.Url)
                {
                    Host = "www." + req.Url.Host
                };

                res.Redirect(builder.Uri.ToString());

            }

            base.OnActionExecuting(filterContext);
        }
    }

然后

[RequiresWwww]
public ActionResult AGreatAction()
{
...
}

或者

[RequiresWwww]
public class HomeController : BaseAppController 
{
..
..
}

希望这能对某些人有所帮助。祝愉快!

我确定这可以工作,但是这个有点糟糕的问题是,如果你需要从IIS关闭SSL,那么你就无法这样做。例如,我需要从lets encrypt获取新证书,只需快速重写关闭,获取证书,然后重新打开。这种方式需要我重新发布。这种方法不太具有多态性,被认为是一种不良实践。 - Piotr Kula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接