web-dev-qa-db-fra.com

Rediriger vers https via réécriture d'URL dans IIS dans l'équilibreur de charge de haricot élastique

Comment utilisez-vous le module de réécriture d'URL d'IIS pour obliger les utilisateurs à utiliser SSL lorsque vous êtes derrière un équilibreur de charge élastique?

24
Ross Pace

C'est plus difficile qu'il n'y paraît pour quelques raisons. Premièrement, l’équilibreur de charge s’occupe de ssl, de sorte que les demandes transmises à partir de l’équilibreur de charge n’utilisent jamais ssl. Si vous utilisez la règle de réécriture traditionnelle, vous obtiendrez une boucle infinie de redirections. Un autre problème à résoudre est que la vérification de l'intégrité AWS échouera si elle reçoit une réponse de redirection.

  1. La première étape de la solution consiste à créer une page healthcheck.html et à la définir dans le répertoire racine. Peu importe le contenu.
  2. Configurez votre équilibreur de charge pour qu'il utilise le fichier healthcheck.html pour les vérifications de l'état.
  3. Ajoutez la règle de réécriture ci-dessous dans la section <system.webServer><rewrite><rules> de votre web.config:

    <rule name="Force Https" stopProcessing="true">
       <match url="healthcheck.html" negate="true" />
       <conditions>
           <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" />
       </conditions>
       <action type="Redirect" url="https://{HTTP_Host}{REQUEST_URI}" redirectType="Permanent" />
    </rule>
    

Notez que la correspondance de règle concerne tout sauf notre fichier healthcheck. Cela garantit la vérification de l'intégrité de l'équilibreur de charge et ne supprime pas par erreur notre serveur de la charge.

L'équilibreur de charge transmet la valeur X-Forwarded-Proto dans l'en-tête, ce qui nous permet de savoir si la demande était via https ou non. Notre règle se déclenche si cette valeur n'est pas https et renvoie une redirection permanente à l'aide de https.

38
Ross Pace

Tout d'abord, je tiens à remercier Ross pour sa réponse originale. Cela m'a permis de créer une règle de réécriture d'URL IIS qui fonctionnait pour moi en utilisant ma règle de redirection HTTP vers HTTPS existante, utilisée avant mon site Web était derrière un AWS Elastic Load Balancer.

<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" />
        <add input="{REMOTE_Host}" pattern="localhost" negate="true" />
        <add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true" />
        <add input="{HTTP_Host}" pattern="localhost" negate="true" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_Host}/{R:1}" redirectType="Permanent" />
</rule>

Cette règle vous permet d'accéder à votre site localement dans Visual Studio ou sur le serveur situé sur le port 80 sans avoir à accéder à HTTPS. Vous ne devez donc avoir qu'une liaison pour le port 80 sur le serveur. Il ne souffre pas de ce que d'autres ont mentionné (chaîne de requête dupliquée, etc.).

Personnellement, je n'ai eu aucun problème avec la vérification de l'état de santé, je n'ai pas eu besoin de créer un fichier sur le serveur pour que l'équilibreur de charge élastique puisse effectuer un ping. Mon équilibreur de charge est configuré sur Health Check sur TCP:80 et cela fonctionne.

13
Luke

La réponse de Luke fonctionne parfaitement si vous utilisez un ELB mais ne fonctionnera pas avec un ALB. Pour ALB Ross Pace, la réponse est correcte. Mais vous pouvez également combiner les deux pour pouvoir accéder au site localement sans être redirigé vers HTTPS.

<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
    <match url="healthcheck.html" negate="true" />
        <conditions>
            <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true"/>
            <add input="{REMOTE_Host}" pattern="localhost" negate="true"/>
            <add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true"/>
            <add input="{HTTP_Host}" pattern="localhost" negate="true"/>
        </conditions>
    <action type="Redirect" url="https://{HTTP_Host}/{R:1}" redirectType="Permanent"/>
</rule>
1
Trevor Orr