2010-02-05 14 views
18

Wie erzwingen example.com umgeleitet werden zu www.example.com mit URL-Umschreiben in IIS7? Welche Art von Regel sollte in die web.config gehen? Vielen Dank.IIS7 URL Rewrite - Hinzufügen "www" Präfix

+1

duplizieren von http://stackoverflow.com/questions/1476934/forwarding-http-mydomain-com-ctrlr-act-val-to-http-www-mydomain-c-ctrlr-act/1476986#1476986 –

+0

Warum Muss das URL-Rewriting sein? Warum nicht der traditionelle Ansatz: Erstelle einen virtuellen Host, der an 'example.com' gebunden ist, was eine einfache 'HTTP Redirect' zu 'http: // www.example.com /' (mit 301 Statuscode und ohne' genaues Ziel) gibt Option, damit der Pfad intakt bleibt. – bobince

+0

Ich glaube, es ist logischer, dieses Verhalten in die Anwendung selbst aufzunehmen, anstatt ein anderes zu erstellen, um es zu unterstützen. Aber sonst gibt es wahrscheinlich keinen Unterschied oder gibt es? – niaher

Antwort

24

Dies ist ein Beispiel von Microsoft für URL Rewrite Module 2.0 die * leitet .fabrikam.com zu 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

danke weiter so die gute Arbeit;) – Kieran

+3

Ich möchte hinzufügen, Sie können dies eine 301 Permanent Redirect mit Kieran

+0
3

Nicht sicher über die beste Art und Weise, dies zu tun, aber ich habe eine Seite mit allen alten Domains/Subdomains laufen diese 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> 

scheint die Arbeit zu erledigen.

+0

Würde dies nicht automatisch jede Anfrage umleiten, die auf Ihren Server kommt? Ich würde erwarten, dass Ihre Kunden, wenn sie ihren Verkehr überprüfen, eine 301 für jede Anfrage sehen. – LeRoy

+0

etwa ein Jahr zu spät, um Ihren Kommentar zu beantworten, aber ich habe eine iis App für www.targetsite.com, und eine andere Anwendung, die alle Domänen beantwortet, die ich weitergeleitet möchte. Wenn eine Anwendung beide hostet, ist es natürlich notwendig, eine Bedingung zu haben. – Sciolist

21

Um es generic Sie folgende URL Rewrite-Regel verwenden können, die für jede Domain arbeiten:

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

Funktioniert so lange, wie Sie keine Subdomains haben. – jpkeisala

0

ich bin nicht sicher, ob das hilft, aber ich entschied sich dies auf App-Ebene zu tun. Hier ist ein schneller Aktionsfilter, den ich dazu geschrieben habe. Fügen Sie die Klasse einfach irgendwo in Ihrem Projekt hinzu, und fügen Sie [RequiresWwww] zu einer einzelnen Aktion oder einem gesamten Controller hinzu.

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

Dann

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

oder

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

Hoffnung, dass jemand hilft. Prost!

+0

Bin sicher, das funktioniert, aber die sucky Problem mit diesem ist, dass, wenn Sie SSL von IIS deaktivieren müssen .. naja .. Sie können nicht. Dies ist für mich erforderlich, um ein neues Zertifikat zu erhalten, indem wir zum Beispiel verschlüsseln, nur ein schnelles Neuschreiben ausschalten, Zertifikate erhalten, wieder einschalten. Auf diese Weise muss ich neu veröffentlichen. Dies ist überhaupt nicht sehr polymorph und wird als schlechte Praxis angesehen. – ppumkin