web-dev-qa-db-fra.com

Rediriger HTTP vers HTTPS dans Azure Application Gateway

J'ai configuré une passerelle d'application pour effectuer une terminaison/un déchargement SSL. L'AG est configuré pour n'écouter que sur le port 443 les connexions HTTPS. Est-il possible de rediriger HTTP vers HTTPS sans avoir à:

  • Créez un nouveau VM contenant un serveur Web qui redirige le trafic et configurez AG pour qu'il écoute sur le port 80 avec le nouveau VM dans son pool principal, ou
  • Autoriser également les connexions HTTP aux machines virtuelles de mes applications et gérer la redirection dans le code de mes applications

J'espère avoir oublié un drapeau/une fonctionnalité dans AG.

10
Davey Chu

Pour développer la réponse @ jonathan-mas,

Cela peut être fait uniquement en ligne de commande (à partir de décembre 2017). Je ne préfère pas l'approche Powershell (portabilité limitée), je préfère AZ CLI car il est plus direct de répondre à cette question.

  1. Créez un écouteur pour votre trafic HTTP (par exemple, FE-HTTP-80-Site). Cela peut être fait à l'aide du portail Azure ou de la CLI.

  2. Créez un écouteur pour votre trafic HTTPS (par exemple FE-HTTPS-443-Site). Cela peut être fait dans le portail Azure ou la CLI.

  3. Créez une configuration de redirection:

az network application-gateway redirect-config create \ --gateway-name AppGateway \ -g RSgroupAppGateway \ -n Redirect-Site-toHTTPS \ --type Permanent \ --include-path true \ --include-query-string true \ --target-listener FE-HTTPS-443-Site

  1. Créez une règle pour le trafic HTTP:

az network application-gateway rule create \ --gateway-name AppGateway \ -g RSgroupAppGateway \ -n Rule-HTTP-80-Site \ --rule-type Basic \ --http-listener FE-HTTP-80-Site \ --redirect-config Redirect-Site-toHTTPS

Référence sur Concept: https://docs.Microsoft.com/en-us/Azure/application-gateway/application-gateway-configure-redirect-powershell

AZ Référence CLI: https://docs.Microsoft.com/en-us/cli/Azure/

7
PotatoFarmer

Ceci est désormais pris en charge par le produit Azure Application Gateway sans outils ni services supplémentaires. Il est configuré à l'aide de PowerShell comme décrit dans ce lien .

Le code PoSH pertinent est copié et collé à partir de la référence pour la redirection du port 80 vers 443:

# Get the application gateway
$gw = Get-AzureRmApplicationGateway -Name AdatumAppGateway -ResourceGroupName AdatumAppGatewayRG

# Get the existing HTTPS listener
$httpslistener = Get-AzureRmApplicationGatewayHttpListener -Name appgatewayhttplistener -ApplicationGateway $gw

# Get the existing front end IP configuration
$fipconfig = Get-AzureRmApplicationGatewayFrontendIPConfig -Name appgatewayfrontendip -ApplicationGateway $gw

# Add a new front end port to support HTTP traffic
Add-AzureRmApplicationGatewayFrontendPort -Name appGatewayFrontendPort2  -Port 80 -ApplicationGateway $gw

# Get the recently created port
$fp = Get-AzureRmApplicationGatewayFrontendPort -Name appGatewayFrontendPort2 -ApplicationGateway $gw

# Create a new HTTP listener using the port created earlier
Add-AzureRmApplicationGatewayHttpListener -Name appgatewayhttplistener2  -Protocol Http -FrontendPort $fp -FrontendIPConfiguration $fipconfig -ApplicationGateway $gw 

# Get the new listener
$listener = Get-AzureRmApplicationGatewayHttpListener -Name appgatewayhttplistener2 -ApplicationGateway $gw

# Add a redirection configuration using a permanent redirect and targeting the existing listener
Add-AzureRmApplicationGatewayRedirectConfiguration -Name redirectHttptoHttps -RedirectType Permanent -TargetListener $httpslistener -IncludePath $true -IncludeQueryString $true -ApplicationGateway $gw

# Get the redirect configuration
$redirectconfig = Get-AzureRmApplicationGatewayRedirectConfiguration -Name redirectHttptoHttps -ApplicationGateway $gw


# Add a new rule to handle the redirect and use the new listener
Add-AzureRmApplicationGatewayRequestRoutingRule -Name rule02 -RuleType Basic -HttpListener $listener -RedirectConfiguration $redirectconfig -ApplicationGateway $gw

# Update the application gateway
Set-AzureRmApplicationGateway -ApplicationGateway $gw 
3
Jonathan Mast

Si vous gérez la redirection sur votre serveur, vous pouvez utiliser l'en-tête X-Forwarded-Proto envoyé par App Gateway pour afficher la demande d'origine et rediriger s'il s'agissait de HTTP à l'aide d'une règle de redirection. 

Apache

Pour ce faire sur Apache, ajoutez ce qui suit dans votre fichier .htaccess

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

IIS

Utilisation du module IIS rewrite / ajoutez-le à votre fichier web.config

<rewrite xdt:Transform="Insert">
  <rules>
    <rule name="HTTPS rewrite behind App Gw rule" stopProcessing="true">
      <match url="^(.*)$" ignoreCase="false" />
      <conditions>
        <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
      </conditions>
      <action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
    </rule>
  </rules>
</rewrite>
2
Scott Semyan

Vous pouvez certainement le faire, mais à ma connaissance, seulement avec PowerShell. Les instructions pour le faire dans ARM se trouvent dans le documentation .

Je posterais habituellement les instructions ici, mais un certain nombre d’étapes sont impliquées, ce serait un message monstre!

1
Martyn C

La réponse de Scott pour IIS ne fonctionnait pas pour moi sous Win2k16\IIS10 et le module 2.0; le proxy AG renvoie une erreur de serveur en amont; Une tentative de chargement du module de réécriture via le gestionnaire IIS entraînerait une erreur XML mal formée. 

Suppression de la transformation d'insertion et les redirections ont commencé à fonctionner.

   <rewrite>
        <rules>
            <rule name="HTTP To HTTPS Redirect Behind App Gtwy" stopProcessing="true">
                <match url="^(.*)$" ignoreCase="false" />
                <conditions logicalGrouping="MatchAny">
                    <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
                </conditions>
                <action type="Redirect" url="https://{SERVER_NAME}{URL}" redirectType="Found" />
            </rule>
        </rules>
    </rewrite>
0
Sam Murcio

Veuillez utiliser la commande ci-dessous et cela fonctionnera pour vous

** $ appgw = Get-AzureRmApplicationGateway -Name GatewayName -ResourceGroupName ResourcegroupName

$ myHTTPSListener = Get-AzureRmApplicationGatewayHttpListener -Name appGatewayHttpListener -ApplicationGateway $ appgw

$ myHTTPListener = Get-AzureRmApplicationGatewayHttpListener -Name appGatewayHttpListener -ApplicationGateway $ appgw

Add-AzureRmApplicationGatewayRedirectConfiguration -Name redirectHttptoHttps -RedirectType Permanent -TargetListener $ myHTTPSListener -IncludePath $ true --IncludeQueryString $ true

$ redirectconfig = Get-AzureRmApplicationGatewayRedirectConfiguration -Name redirectHttptoHttps -ApplicationGateway $ appgw

Add-AzureRmApplicationGatewayRequestRoutingRule -Name redirectrule -RuleType Basic -HttpListener $ myHTTPListener -RedirectConfiguration $ redirectconfig -ApplicationGateway $ appgw

Set-AzureRmApplicationGateway -ApplicationGateway $ appgw **

0
Sayed Azharuddin