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"
Odpowiedz
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>
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.
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
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
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>
Działa tak długo, dopóki nie masz subdomen. – jpkeisala
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!
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
duplikat http://stackoverflow.com/questions/1476934/forwarding-http-moja_domena-com-ctrlr-act-val-to-http-www-mydomain-com-ctrlr-act/1476986#1476986 –
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
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