Angular e IIS. Redirecionar para HTTPS mantendo URL completo

Angular e IIS. Redirecionar para HTTPS mantendo URL completo

Preciso redirecionar um URL completo de HTTP para HTTPS para um aplicativo Angular que precisa ser hospedado em um servidor IIS.

Criei as seguintes regras, mas não está funcionando, só funciona com o domínio principal (comohttp://www.somedomain.com, ele redireciona muito bem, mas comhttp://www.somedomain.com/route

Aqui estão minhas regras. O que estou fazendo de errado?

<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>

A ideia é redirecionarhttp://www.somedomain.com/route/somethingouhttp://somedomain.com/route/somethingparahttps://www.somedomain.com/route/something

Responder1

Existem várias maneiras de fazer o mesmo redirecionamento. Se você estiver usando url="https://{HTTP_HOST}/{R:1}" você deve adicionar appendQueryString="true", caso contrário o caminho do URI não será anexado.

Então a configuração deve ficar assim:

<?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>

Mas normalmente estou usando outra regra com redirecionamento 301, que é melhor tratada pelos navegadores em algumas condições. Nesse caso você deve usar outro tipo de 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>

Responder2

você está fazendo certo, mas o IIS tem seu cache com fio, então às vezes você não vê as alterações imediatamente, pelo que me lembro, de alguma forma ele pode sobreviver ao iisreset. Além disso, o Google Chrome detectou para lembrar redirecionamentos.

Então a sugestão é esperar um pouco ou reiniciar as duas máquinas (parece loucura, eu sei)

Aqui está minha configuração de trabalho. Mesma ideia, mas condições diferentes.

     <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>

informação relacionada