2016-02-17 13 views
9

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?

+0

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

+0

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

+0

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

Odpowiedz

-1

Wypróbuj tę konfigurację. Prace na mojej stronie

<rule name="Redirect to HTTPS" stopProcessing="true"> 
<match url="(.*)" /> 
<conditions><add input="{HTTPS}" pattern="^OFF$" /> 
</conditions> 
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" /> 
</rule> 
+0

Nie, nie, potrzebuję użyć wartości ShouldBeHttps, która jest "obliczana" po stronie serwera dopiero po zakończeniu przepisywania, więc nie mogę "zakodować" "https w akcji przepisywania. – patrykgliwinski

-1

Jest to głównie błąd w IIS

1. Wyłącz URL Rewrite Cache

2.Dodaj zdjęcia "niebezpiecznego" zmienna reguły

3.Wyczyść pamięć podręczną

i najlepszy sposób, jeśli można to zrobić w kodzie bez użycia Przepisz

W zależności od wersji używasz IIS, to może naprawić swój błąd:

x64

x86

KB2974666

Powiązane problemy