
Ich muss für eine Angular-App, die auf einem IIS-Server gehostet werden muss, eine vollständige URL von HTTP auf HTTPS umleiten.
Ich habe die folgenden Regeln erstellt, aber sie funktionieren nicht, sie funktionieren nur mit der Hauptdomäne (wiehttp://www.somedomain.com, es leitet problemlos weiter, aber mithttp://www.somedomain.com/route
Hier sind meine Regeln. Was mache ich falsch?
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
</rule>
<rule name="Angular Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="./index.html" />
</rule>
</rules>
Die Idee ist, umzuleitenhttp://www.somedomain.com/route/somethingoderhttp://somedomain.com/route/somethingZuhttps://www.somedomain.com/route/something
Antwort1
Es gibt mehrere Möglichkeiten, dieselbe Umleitung durchzuführen. Wenn Sie url="https://{HTTP_HOST}/{R:1}" verwenden, müssen Sie appendQueryString="true" hinzufügen, sonst wird der URI-Pfad nicht angehängt.
Die Konfiguration sollte also so aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Normalerweise verwende ich jedoch eine andere Regel mit 301-Weiterleitung, die unter bestimmten Bedingungen von Browsern besser gehandhabt wird. In diesem Fall müssen Sie einen anderen URI-Typ verwenden: url="https://{HTTP_HOST}{REQUEST_URI}"
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="HTTPS force" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Antwort2
Sie machen es richtig, aber IIS hat seinen verkabelten Cache, sodass Sie Änderungen manchmal nicht sofort sehen. Soweit ich mich erinnere, kann es iisreset irgendwie überleben. Außerdem merkt sich Google Chrome Weiterleitungen.
Der Vorschlag ist also, ein wenig zu warten oder beide Maschinen neu zu starten (klingt verrückt, ich weiß)
Hier ist meine funktionierende Konfiguration. Dieselbe Idee, aber andere Bedingungen.
<rules>
<rule name="http to https" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{SERVER_PORT}" pattern="443" negate="true" />
<add input="{HTTP_HOST}" pattern="\.local$" negate="true" />
<add input="{URL}" pattern="/robots.txt" negate="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
</rule>
</rules>