asp.net mvc:如何将非www重定向到www,反之亦然

时间:2010-07-07 17:32:32

标签: c# iis asp.net-mvc-2

我想将所有www流量重定向到非www流量

我已将其复制到我的web.config

<system.webServer> / <rewrite> / <rules> 

<rule name="Remove WWW prefix" > 
<match url="(.*)" ignoreCase="true" /> 
<conditions> 
<add input="{HTTP_HOST}" pattern="^www\.domain\.com" /> 
</conditions> 
<action type="Redirect" url="http://domain.com/{R:1}" 
    redirectType="Permanent" /> 
</rule> 

每篇文章

  

How to redirect with "www" URL's to without "www" URL's or vice-versa?

但我收到了500内部服务器错误。

8 个答案:

答案 0 :(得分:75)

您可能会考虑采用不同的方法:

protected void Application_BeginRequest (object sender, EventArgs e)
{
   if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
   {
      UriBuilder builder = new UriBuilder (Request.Url);
      builder.Host = "www." + Request.Url.Host;
      Response.Redirect (builder.ToString (), true);
   }
}

然而,这将进行302重定向,因此建议稍微调整一下:

protected void Application_BeginRequest (object sender, EventArgs e)
{
   if (!Request.Url.Host.StartsWith ("www") && !Request.Url.IsLoopback)
   {
      UriBuilder builder = new UriBuilder (Request.Url);
      builder.Host = "www." + Request.Url.Host;
      Response.StatusCode = 301;
      Response.AddHeader ("Location", builder.ToString ());
      Response.End ();
   }
}

这个将返回301 Moved Permanently。

答案 1 :(得分:12)

如果您直接复制它,那么您的web.config

中的标记不正确

你需要

<system.webServer> 
    <rewrite>
      <rules>
        <rule name="Remove WWW prefix" > 
        <match url="(.*)" ignoreCase="true" /> 
        <conditions> 
        <add input="{HTTP_HOST}" pattern="^www\.domain\.com" /> 
        </conditions> 
        <action type="Redirect" url="http://domain.com/{R:1}" 
            redirectType="Permanent" /> 
        </rule> 
      </rules>
    </rewrite>
<system.webServer>

的行
<system.webServer> / <rewrite> / <rules> 

表示您需要将配置放在web.Config中的该位置 <system.webServer>是您的web.Config文件的configSections之一。

编辑:

确保首先为IIS7安装了URL Rewrite module

上面的页面讨论了将HTTP重定向到HTTPS,但这个概念仍然适用于WWW到非WWW

此外,这里有一些detailed information关于它们如何结合在一起。

答案 2 :(得分:8)

    **For a www to a non www Thanks @developerart**

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
        {
            UriBuilder builder = new UriBuilder(Request.Url);
            builder.Host = Request.Url.Host.Replace("www.","");
            Response.StatusCode = 301;
            Response.AddHeader("Location", builder.ToString());
            Response.End();
        }
    }

答案 3 :(得分:5)

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if (!this.Request.Url.Host.StartsWith("www") && !this.Request.Url.IsLoopback)
    {
        var url = new UriBuilder(this.Request.Url);
        url.Host = "www." + this.Request.Url.Host;
        this.Response.RedirectPermanent(url.ToString(), endResponse: true);
    }
}

答案 4 :(得分:3)

基于用户151323'回答,这里是Azure用户的完整答案,他们也希望阻止用户从azurewebsites.net子域访问该站点(这将进入主类内的Global.asax( MVC用户MvcApplication)):

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Url.Host.StartsWith("YourSite.azurewebsites") && !Request.Url.IsLoopback)
        {
            Response.StatusCode = 301;
            Response.AddHeader("Location", "www.YourSite.com");
            Response.End();

            return;
        }


        if (!Request.Url.Host.StartsWith("www") && !Request.Url.IsLoopback)
        {
            UriBuilder builder = new UriBuilder(Request.Url);
            builder.Host = "www." + Request.Url.Host;
            Response.StatusCode = 301;
            Response.AddHeader("Location", builder.ToString());
            Response.End();
        }
    }

答案 5 :(得分:2)

您可以使用https和www重定向。 (您需要更改&#34;示例&#34;)

<system.webServer>
  <!-- For force ssl and www -->
  <rewrite>
    <rules>
      <!-- For force ssl -->
      <rule name="http to https" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTPS}" pattern="^OFF$" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
      </rule>
      <!-- For force ssl -->
      <!-- For force www -->
      <rule name="redirect to www" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
          <add input="{HTTP_HOST}"  pattern="^example\.com$" />
        </conditions>
        <action type="Redirect" url="https://www.{HTTP_HOST}/{R:0}" redirectType="Permanent" />
      </rule>
      <!-- For force www -->
    </rules>
  </rewrite>
  <!-- For force ssl and www -->
</system.webServer>

答案 6 :(得分:0)

我知道这个线程是古老的,似乎已经被解决了。但是,检查每个人的global.asax建议并检查你是否在本地工作可能是有用的。这样在使用IIS Express进行开发期间,您的网站不会尝试重定向到“网站”。子域。

以下内容:

protected void Application_BeginRequest(
        object sender,
        EventArgs e)
    {
        if (!Request.IsLocal)
        {
            // Do your check for naked domain here and do permanent redirect
        }
    }

答案 7 :(得分:0)

您可以通过编写规则在服务器级别以及在 IIS 中实现非 www 到 www 的重定向。

此规则有效,但请注意,此规则仅在您在 IIS 服务器上安装 URL Rewrite 时有效。如果您的 IIS 服务器上未安装 URL Rewrite,则此规则将不起作用。

为了在您的服务器上安装 URL Rewrite,请访问此官方网站 USER_INFO_4 并在您的服务器上下载扩展程序并进行安装。之后重新启动 IIS 服务器,它就会工作。

URL Rewrite Extension 官网链接:link

<rewrite>
            <rules>
                <rule name="Redirect yourdomainname.com to http://www.yourdomainname.com HTTP" patternSyntax="ECMAScript" stopProcessing="true">
                    <match url=".*"></match>
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^yourdomainname.com$"></add>
                        <add input="{HTTPS}" pattern="off"></add>
                    </conditions>
                    <action type="Redirect" url="http://www.yourdomainname.com/{R:0}" redirectType="Permanent" appendQueryString="true"></action>
                </rule>
            </rules>
        </rewrite>