2010-02-05 9 views
18

¿Cómo forzar a example.com a ser redirigido a www.example.com con la reescritura de URL en IIS7? ¿Qué tipo de regla debería ir a la web.config? Gracias.Reescritura de URL IIS7 - Agregue el prefijo "www"

+1

duplicado de http://stackoverflow.com/questions/1476934/forwarding-http-mydomain-com-ctrlr-act-val-to-http-www-mydomain-com-ctrlr-act/1476986#1476986 –

+0

Por qué tiene que ser reescritura de URL? ¿Por qué no el enfoque tradicional: crear un host virtual vinculado a 'example.com' que da un simple 'HTTP Redirect' a' http: // www.example.com/'(con código de estado 301, y sin el 'destino exacto' 'opción, por lo que la ruta se mantiene intacta). – bobince

+0

Creo que es más lógico incluir este comportamiento dentro de la aplicación en sí, en lugar de crear otro para admitirlo. Pero de lo contrario, probablemente no haya ninguna diferencia, ¿o no? – niaher

Respuesta

24

Esta es la muestra de Microsoft para URL Rewrite Module 2.0 que redirige * .fabrikam.com a 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> 
+1

gracias sigan con el buen trabajo;) – Kieran

+3

me gustaría agregar que puede hacer esto como un 301 redireccionamiento permanente con Kieran

+0
3

No está seguro acerca de la mejor manera posible para hacer esto, pero tengo un sitio con todos los viejos dominios/subdominios que maneja este 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> 

parece hacer el trabajo.

+0

¿Esto no redirigiría automáticamente todas las solicitudes que llegan a su servidor? Esperaría que sus clientes, si inspeccionaban su tráfico, vieran un 301 por cada solicitud. – LeRoy

+0

con un año de retraso para responder a su comentario, pero tengo una aplicación iis para www.targetsite.com y otra que responde a los dominios que deseo reenviar. si una aplicación aloja ambas, por supuesto es necesario tener una condición. – Sciolist

21

Para que sea más genérico puede utilizar siguiente regla de reescritura de URL, que trabaja para cualquier dominio:

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

+0

Funciona siempre que no tenga subdominios. – jpkeisala

0

no estoy seguro de si esto ayuda, pero he optado por hacer esto a nivel de aplicación. Aquí hay un filtro de acción rápida que escribí para hacer esto ... Simplemente agregue la clase en algún lugar de su proyecto, y luego puede agregar [RequiresWwww] a una sola acción o a un controlador completo.

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

Entonces

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

o

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

la esperanza de que ayude a alguien. ¡Aclamaciones!

+0

Estoy seguro de que esto funciona pero el sucky problema con esto es que si necesita desactivar SSL de IIS ... bueno ... no puede. Esto para mí es necesario para obtener un nuevo certificado de let encrypt por ejemplo, solo una rápida reescritura, obtener certs, volver a encender. De esta manera necesito volver a publicar. Esto no es muy polimórfico y se considera una mala práctica. – ppumkin

Cuestiones relacionadas