2010-02-05 16 views
18

Jak zmusić witrynę example.com do przekierowania na stronę www.example.com z przepisywaniem adresów URL w IIS7? Jaka zasada powinna przejść do web.config? Dzięki.Przekierowanie URL IIS7 - Dodaj prefiks "www"

+1

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

+0

Dlaczego czy musi to być przepisywanie adresów URL? Dlaczego nie tradycyjne podejście: utwórz wirtualny host powiązany z 'example.com', który daje proste 'Przekierowanie HTTP' na' http: // www.example.com/'(z kodem stanu 301 i bez" dokładnego miejsca docelowego ") "opcja, więc ścieżka pozostaje nienaruszona). – bobince

+0

Uważam, że bardziej logiczne jest umieszczenie tego zachowania w samej aplikacji, zamiast tworzenia innego, aby ją wspierać. Ale poza tym prawdopodobnie nie ma żadnej różnicy, czy też istnieje? – niaher

Odpowiedz

24

Jest to próba Microsoftu na URL Rewrite Module 2.0 który przekierowuje * .fabrikam.com do 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

dziękuję za dobrą robotę;) – Kieran

+3

Chciałbym dodać, możesz uczynić to 301 stałym przekierowaniem za pomocą Kieran

+0
3

Nie wiesz o możliwie najlepszy sposób, aby to zrobić, ale mam stronę z wszystkich domen/subdomen starych uruchomionych ten 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> 

wydaje się to zadanie.

+0

Czy to nie byłoby automatyczne przekierowanie każdego żądania przychodzącego na serwer? Oczekuję, że klienci, jeśli sprawdzą swój ruch, zobaczą 301 na każde żądanie. – LeRoy

+0

o rok spóźniony, aby odpowiedzieć na Twój komentarz, ale mam jedną aplikację iis dla witryny www.targetsite.com i inną aplikację, która odpowiada na wszelkie domeny, które chcę przekazać. jeśli jedna aplikacja obsługuje oba, konieczne jest posiadanie warunku. – Sciolist

21

Aby uczynić go bardziej ogólny można wykorzystać następującą regułę URL Rewrite który pracuje dla dowolnej domeny:

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

Działa tak długo, dopóki nie masz subdomen. – jpkeisala

0

nie jestem pewien, czy to pomaga, ale zdecydowaliśmy się to zrobić na poziomie aplikacji. Oto szybki filtr akcji, który napisałem, aby to zrobić. Po prostu dodaj klasę gdzieś w projekcie, a następnie dodaj [RequiemWww] do pojedynczej akcji lub całego kontrolera.

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

Następnie

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

lub

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

nadzieja, że ​​ktoś pomaga. Twoje zdrowie!

+0

Jestem pewien, że to działa, ale problemem jest to, że jeśli chcesz wyłączyć SSL z IIS ... cóż ... nie możesz. To jest dla mnie wymagane, aby uzyskać nowe certyfikaty z pozwalać na szyfrowanie na przykład, wystarczy szybkie przepisanie wyłączyć, uzyskać certyfikaty, włączyć ponownie. W ten sposób muszę ponownie opublikować. To nie jest bardzo polimorficzne i uważa się za złą praktykę. – ppumkin

Powiązane problemy