
Мне нужно перенаправить полный URL-адрес с HTTP на HTTPS для приложения Angular, которое должно быть размещено на сервере IIS.
Я создал следующие правила, но они не работают, они работают только с основным доменом (например,http://www.somedomain.com, он перенаправляет просто отлично, но но сhttp://www.somedomain.com/route
Вот мои правила. Что я делаю не так?
<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>
Идея состоит в том, чтобы перенаправитьhttp://www.somedomain.com/route/somethingилиhttp://somedomain.com/route/somethingкhttps://www.somedomain.com/route/something
решение1
Есть несколько способов сделать то же самое перенаправление. Если вы используете url="https://{HTTP_HOST}/{R:1}", вам нужно добавить appendQueryString="true", в противном случае путь URI не будет добавлен.
Итак, конфигурация должна выглядеть так:
<?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>
Но я обычно использую другое правило с 301 редиректом, которое лучше обрабатывается браузерами при некоторых условиях. В таком случае вам придется использовать другой тип uri: 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>
решение2
Вы делаете это правильно, но у IIS есть свой кэш, поэтому иногда вы не видите изменения сразу, насколько я помню, он каким-то образом может пережить iisreset. Также Google Chrome заметил, что запоминает перенаправления.
Поэтому советуем немного подождать или перезагрузить обе машины (звучит безумно, я знаю).
Вот мой рабочий конфиг. Та же идея, но другое состояние.
<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>