2010-07-07 11 views
40

umleiten würde Ich mag alle www Verkehr nicht-www-Verkehr umleitenasp.net MVC: Wie ein nicht www www und vice versa

ich dies in meiner web.config kopiert haben

<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> 

pro diesen Beitrag

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

aber ich habe Ein 500 interner Serverfehler.

Antwort

73

Sie könnten einen anderen Ansatz betrachten:

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); 
    } 
} 

Dies ist jedoch eine 302-Umleitung tun so ein wenig zwicken empfohlen:

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(); 
    } 
} 

Dieses dauerhaft 301 Moved zurück.

+0

funktioniert dieser Ansatz in MVC? Ihr Weg ist, wie ich es in Web Forms mache, aber ich denke, das MVC Routing Framework wird anders behandelt. –

+1

Ich nahm einen sehr ähnlichen Ansatz. Siehe http://stackoverflow.com/questions/2175975/asp-net-mvc-301-redirect-from-www-domain-com-to-domain-com – spender

+0

@rockinthesixstring: Es funktioniert in MVC. Es beginnt sehr früh, so dass es keine Rolle spielt, ob MVC oder WebForms die Anfrage später bearbeiten wird. –

12

, wenn Sie es direkt kopiert, dann haben Sie eine falsche Markup in Ihrer web.config

Sie benötigen

<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> 

Die Linie, die sagt

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

wird besagt, dass Sie setzen müssen die Konfiguration an diesem Ort in Ihrer web.Config.
<system.webServer> ist eine der configSections Ihrer Datei Web.config.

EDIT:

Achten Sie darauf, zuerst die URL Rewrite module für IIS7

Die Seite oben spricht über Umleitung von HTTP auf HTTPS, aber das Konzept nach wie vor für WWW nicht WWW

gilt auch installiert haben, hier ist ein paar detailed information darüber, wie alles zusammen kommt.

+0

ok..i dies getan haben, und es sagt ist kein gültiger Tag – Luke101

+0

Lemme hineinschauen. –

+0

Ich habe meine Antwort bearbeitet. Ich suche immer noch, wie man es so macht, dass Visual Studio Sie nicht anschreien, aber es sollte für IIS7 funktionieren –

6
**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(); 
     } 
    } 
+0

Nein, Die angeforderte URL "/" ist ungültig. – Toolkit

2

Aufbauend auf Benutzer 151.323' Antwort, hier die komplette Antwort für Azure-Benutzer, die auch von einem azurewebsites.net Sub-Domain der Zugriff auf die Site-Benutzer verhindern wollen (dies geht in die Global.asax in der Hauptklasse (MvcApplication für MVC Benutzer)):

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
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); 
    } 
} 
0

ich weiß, dass dieser Thread ist alt und scheint zu Tode zu beantworten. Es kann jedoch nützlich sein, den globalen.asax-Vorschlag von jedem mit einer Überprüfung zu versehen, ob Sie lokal arbeiten oder nicht. Auf diese Weise wird Ihre Site während der Entwicklung mit IIS Express nicht versuchen, auf eine Subdomäne "www" umzuleiten.

Etwas entlang der Linie:

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

Sie für https und www Redirect verwenden können.(Sie müssen „Beispiel“ ändern)

<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>