Mam dwie witryny IIS skonfigurowane na tym samym serwerze IIS. Witryna A zawiera większość treści i to właśnie użytkownicy są wyświetlani podczas zgłaszania prośby o nasz adres (np. Www.websitea.com). Witryna B to osobny projekt, który zawiera tylko część całej treści, więc jest wewnętrzny (związany w IIS z serwisem siteb.com), ale poprzez URL Rewrite użytkownicy mogą uzyskać do niego dostęp, wpisując www.websitea.com/websiteb .Próba przekierowania HTTP do HTTPS (C#, IIS), ale HTTPS wraca do HTTP w nagłówkach odpowiedzi - pętla przekierowania
URL przepisać wygląda to na stronie internetowej za web.config:
<rewrite>
<rules>
<clear />
<rule name="Website B rewrite rule" stopProcessing="true">
<match url="^websiteb(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{CACHE_URL}" pattern="^(https?)://" />
</conditions>
<action type="Rewrite" url="{C:1}://websiteb.com{R:1}" />
</rule>
</rules>
</rewrite>
Opcja {CACHE_URL} i {C: 1} bity są zachować protokół używany. Na przykład. użytkownik żądający strony www.websitea.com/websiteb/foo.html na HTTP zostaje "przepisany" na stronę webb.com/foo.html na HTTP, a prośba do websitea.com/websiteb/bar.html o HTTPS zostaje "przepisana" do witryny webb.com/bar.html na HTTPS.
Teraz, dla niektórych stron B witryny, chcemy, aby użytkownik używał tylko HTTPS - jest to ustawione w naszej właściwości SomePageViewModel's ShouldBeHttps. Więc następujący kod jest używany w ActionFilterAttribute:
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Request.IsSecureConnection)
return;
var result = filterContext.Result as ViewResult;
if (result != null)
{
if ((result.Model as SomePageViewModel).ShouldBeHttps)
{
HandleNonHttpsRequest(filterContext);
}
}
}
protected virtual void HandleNonHttpsRequest(ActionExecutedContext filterContext)
{
if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("The method must be a GET");
string url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:");
filterContext.Result = new RedirectResult(url);
}
Powiedzmy www.websitea.com/websiteb/securepage.html spowoduje prawdziwej wartości nieruchomości ShouldBeHttps.
Teraz, kiedy testuję go bezpośrednio na serwerze przechodząc na stronę websiteb.com/securepage.html na serwerze HTTP, otrzymuję poprawne przekierowanie (kod stanu 302) na stronę webb.com/securepage.html na HTTPS.
Spodziewam się, że po przejściu na stronę www.websitea.com/websiteb/securepage.html w protokole HTTP nastąpi przekierowanie na stronę www.websitea.com/websiteb/securepage.html na HTTPS. Jednak moje przeglądarki kończą się pętlą przekierowania (ERR_TOO_MANY_REDIRECTS). Widzę w Skrzypek na zakładce TextView, że wydaje się być poprawnie skonfigurowane:
<html>
<head>
<title>Object moved</title>
</head>
<body>
<h2>Object moved to <a href="https://www.websitea.com/websiteb/securepage.html">here</a>.</h2>
</body>
</html>
Ale karta Nagłówki Wystawy:
Response Headers
HTTP/1.1 302 Found
(...)
Transport
Location: http://www.websitea.com/websiteb/securepage.html
Więc zamiast do https, to znowu http i że znowu uderza w filtr i tak dalej.
Czy jest coś, czego mi brakuje? Czy to jakieś ustawienie IIS?
Myślę, że problem jest reguła przepisywania nie widzi różnicy b pomiędzy przychodzącym połączeniem http lub https, więc będzie przepisywać oba z powrotem do https. – Quintium
Wydaje mi się, że działa poprawnie, widzę prośby do HTTPS www.websitea.com/websiteb/index.html poprawnie przechodząc na stronę HTTPS websiteb.com/index.html i HTTP na HTTP; Właściwość IsSecureConnection w HttpContext.Current.Request jest ustawiona poprawnie na true/false. – patrykgliwinski
Ah. Widzę. Źle odczytałem tę część. Ale jeśli chcesz, aby witryna internetowa przekierowywała do witryny sieci Web w regule przepisywania, czy zamiast tego Be ? –
Quintium