2010-02-05 13 views
18

Come forzare example.com a essere reindirizzato su www.example.com con la riscrittura dell'URL in IIS7? Che tipo di regola dovrebbe andare in web.config? Grazie.Riscritto URL IIS7 - Aggiungi prefisso "www"

+1

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

+0

Perché deve essere la riscrittura dell'URL? Perché non l'approccio tradizionale: creare un host virtuale associato a 'example.com' che fornisce un semplice 'Reindirizzamento HTTP' a' http: // www.example.com/'(con codice di stato 301 e senza 'destinazione esatta) 'opzione, quindi il percorso rimane intatto). – bobince

+0

Credo che sia più logico includere questo comportamento all'interno dell'applicazione stessa, piuttosto che crearne un altro per supportarlo. Ma altrimenti probabilmente non c'è alcuna differenza, o c'è? – niaher

risposta

24

Si tratta di esempio di Microsoft per URL Rewrite Module 2.0 che reindirizza * .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

grazie continua il buon lavoro;) – Kieran

+3

Vorrei aggiungere che puoi rendere questo un reindirizzamento permanente 301 con Kieran

+0
3

Non sono sicuro circa il modo migliore per fare questo, ma ho un sito con tutti i vecchi domini/sottodomini che eseguono questo 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> 

sembra ottenere il lavoro fatto.

+0

Questo non solo reindirizza automaticamente ogni richiesta che arriva al tuo server? Mi aspetterei che i tuoi clienti, se ispezionassero il loro traffico, vedessero un 301 per ogni richiesta. – LeRoy

+0

circa un anno di ritardo per rispondere al tuo commento, ma ho una sola app per www.targetsite.com, e un'altra applicazione che risponde ai domini che voglio inoltrare. se un'applicazione ospita entrambi, è ovviamente necessario avere una condizione. – Sciolist

21

Per renderlo più generico è possibile utilizzare seguente regola URL Rewrite, che lavora per qualsiasi 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

Funziona finché non si dispone di sottodomini. – jpkeisala

0

non sono sicuro se questo aiuta, ma ho scelto di fare questo a livello di applicazione. Ecco un rapido filtro azione che ho scritto per fare questo .. Aggiungi semplicemente la classe da qualche parte nel tuo progetto, quindi puoi aggiungere [RequiresWwww] a una singola azione o a un intero controller.

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

Poi

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

o

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

Speranza che aiuta qualcuno. Saluti!

+0

Sono sicuro che questo funziona, ma il problema è che se si deve disattivare SSL da IIS, beh, non è possibile. Questo per me è richiesto per ottenere un nuovo certificato da criptare per esempio, basta una rapida riscrittura per disattivare, ottenere certificati, riaccendere. In questo modo ho bisogno di ripubblicare. Questo non è affatto polimorfico e considerato una cattiva pratica. – ppumkin

Problemi correlati