2010-07-07 3 views
40

Je voudrais rediriger tout le trafic www au trafic non wwwasp.net mvc: Comment rediriger un non www www et vice versa

j'ai copié ceci dans mon 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> 

par ce poste

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

mais je suis une erreur interne du serveur 500.

Répondre

73

Vous pourriez envisager une approche différente:

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

Ce sera toutefois faire une redirection 302 donc un peu tweak est recommandé:

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

Celui-ci retournera 301 Moved en permanence.

+0

cette approche fonctionne-t-elle dans MVC? Votre façon de procéder est la suivante dans Web Forms, mais je pense que le MVC Routing Framework est traité différemment. –

+1

J'ai pris une approche très similaire. Voir http://stackoverflow.com/questions/2175975/asp-net-mvc-301-redirect-from-www-domain-com-to-domain-com – spender

+0

@rockinthesixstring: Cela fonctionne dans MVC. Il démarre très tôt, peu importe si MVC ou WebForms va traiter la demande par la suite. –

12

si vous avez copié directement alors vous avez un balisage incorrect dans votre web.config

vous avez besoin

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

La ligne qui dit

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

est indiquant que vous devez mettre la configuration à cet endroit dans votre web.Config.
<system.webServer> est l'une des configSections de votre fichier web.Config.

EDIT:

Assurez-vous d'abord le URL Rewrite module installé pour IIS7

La page ci-dessus parle de redirection HTTP vers HTTPS, mais le concept applique toujours WWW à la non WWW

En outre, Voici quelques detailed information sur la façon dont tout se réunit.

+0

ok..i ont fait cela et il dit n'est pas une étiquette valide – Luke101

+0

Lemme examiner. –

+0

J'ai édité ma réponse. Je cherche toujours à faire en sorte que Visual Studio ne vous crie pas dessus, mais cela devrait fonctionner pour 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

non, L'URL demandée "/", n'est pas valide. – Toolkit

2

Miser sur l'utilisateur 151323' réponse, voici la réponse complète pour les utilisateurs Azure qui veulent aussi empêcher les utilisateurs d'accéder au site à partir d'un sous-domaine azurewebsites.net (cela va dans votre Global.asax dans la classe principale (MvcApplication pour les utilisateurs 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

Je sais que ce fil est ancien et semble répondre à la mort. Mais il peut être utile d'envelopper la suggestion global.asax de tout le monde avec une vérification si vous travaillez localement ou non. De cette façon, lors du développement à l'aide d'IIS Express, votre site n'essaiera pas de rediriger vers un sous-domaine "www".

Quelque chose le long de la ligne de:

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

Vous pouvez utiliser pour https et redirect www.(Vous devez changer « exemple »)

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