2010-07-07 14 views
40

Chciałbym przekierować cały ruch www ruchu non-wwwasp.net mvc: Jak przekierować non www do www i odwrotnie

mam skopiowane to do mojego 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> 

za ten post

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

ale mam błąd wewnętrzny serwera 500.

Odpowiedz

73

Można rozważyć inne podejście:

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

Będzie to jednak zrobić przekierowanie 302, więc jest zalecane trochę uszczypnąć:

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

Ten powróci 301 Przeniesiono na stałe.

+0

czy to podejście działa w MVC? Na swój sposób robię to w Web Forms, ale myślę, że MVC Routing Framework jest traktowany inaczej. –

+1

Podjęłam bardzo podobne podejście. Zobacz http://stackoverflow.com/questions/2175975/asp-net-mvc-301-redirect-from-www-domain-com-to-domain-com – spender

+0

@rockinthesixstring: Działa w MVC. Występuje bardzo wcześnie, więc nie ma większego znaczenia, czy MVC czy WebForms będzie przetwarzało żądanie później. –

12

jeśli go kopiowane bezpośrednio potem trzeba nieprawidłowe znaczników w pliku web.config

trzeba

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

linia, która mówi

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

jest stwierdzając, że trzeba umieścić config w tej lokalizacji w twoim web.Config.
<system.webServer> to jedna z konfiguracji sekcji pliku web.Config.

EDIT:

Upewnij się najpierw mieć URL Rewrite module zainstalowany na IIS7

Strona powyżej rozmów o przekierowanie HTTP na HTTPS, ale koncepcja nadal obowiązuje dla WWW nieprzestrzegania WWW

także tutaj jest jakiś detailed information o tym, jak to wszystko razem.

+0

ok..i tego zrobić i mówi nie jest poprawnym tag – Luke101

+0

lemingi na nią patrzeć. –

+0

Edytowałem swoją odpowiedź. Nadal szukam, jak to zrobić, aby program Visual Studio nie krzyczał na ciebie, ale powinien działać dla IIS7 –

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

nie, żądany URL "/" jest nieprawidłowy. – Toolkit

2

Opierając się na użytkownikiem 151323' odpowiedź, tutaj pełna odpowiedź dla użytkowników Azure, którzy również chcą uniemożliwić użytkownikom dostęp do witryny z azurewebsites.net subdomenie (to idzie do swojego Global.asax wewnątrz głównego klasy (MvcApplication dla użytkowników MVC)):

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

znam ten wątek jest starożytny i wydaje się odpowiedzieć na śmierć. Ale może być użyteczne oblewanie globalnej sugestii wszystkich osób za pomocą sprawdzania, czy pracujesz lokalnie, czy nie. W ten sposób podczas programowania przy użyciu IIS Express Twoja witryna nie będzie próbowała przekierowywać do subdomeny "www".

Coś wzdłuż linii:

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

można użyć do przekierowania https i www.(Trzeba zmienić „Przykład”)

<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> 
Powiązane problemy