web-dev-qa-db-fra.com

Redirection de l'EC2 Elastic Load Balancer de HTTP vers HTTPS

Je veux rediriger toutes les requêtes HTTP vers les requêtes https sur ELB . J'ai deux instances EC2. J'utilise nginx pour le serveur. J'ai essayé de réécrire les fichiers de configuration nginx sans aucun succès. J'aimerais quelques conseils à ce sujet.

89
Amit Badheka

AWS Application Load Balancers prend désormais en charge la redirection HTTP native vers HTTPS.

Pour l'activer dans la console, procédez comme suit:

  1. Accédez à votre Load Balancer dans EC2 et à l'onglet "Listeners"
  2. Sélectionnez "Afficher/modifier les règles" sur votre listener HTTP.
  3. Supprimer toutes les règles sauf celle par défaut (en bas)
  4. Modifiez la règle par défaut: choisissez l'action "Rediriger vers", laissez tout par défaut et entrez "443" comme port.

Native redirect listener rule

La même chose peut être obtenue en utilisant le CLI comme décrit ici .

Il est également possible de faire cela dans Cloudformation, où vous devez configurer un objet Listener comme ceci:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

Si vous utilisez toujours Classic Load Balancers, utilisez l'une des configurations NGINX décrites par les autres.

55
Ulli

ELB sets X-Forwarded-Proto en-tête, vous pouvez l’utiliser pour détecter si la requête initiale était HTTP et rediriger ensuite vers HTTPS.

Vous pouvez essayer ceci dans votre server conf:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

Jetez un coup d'œil à documents ELB .

105
Dmitry Mukhin

J'ai eu le même problème, dans ma situation, HTTPS était entièrement géré par ELB et, comme je ne connaissais pas mon domaine source à l'avance, j'ai fini par faire quelque chose comme:

server {
  listen 81;
  return 301 https://$Host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

Et puis, bien sûr, en pointant l'ELB "https" sur le port d'instance 80, puis la route "http" vers le port d'instance 81.

32
TylerFowler

ELB (Amazon Elastic Load Balancer) prend en charge un en-tête HTTP appelé X-FORWARDED-PROTO. Toutes les demandes HTTPS qui passent par l’ELB auront la valeur X-FORWARDED-PROTO égale à "HTTPS". Pour les demandes HTTP, vous pouvez forcer HTTPS en ajoutant la règle de réécriture simple suivante. Pour moi ça marche bien!

Apache

Vous pouvez ajouter les lignes suivantes dans votre fichier .htaccess:

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

Ou si vous utilisez vhost.conf pour gérer plusieurs domaines sur le même serveur Web EC2, vous pouvez ajouter ce qui suit au fichier vhost.conf (ajoutez-le au domaine pour lequel vous souhaitez utiliser https):

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

[~ # ~] iis [~ # ~]

Installez le module IIS Url-Rewrite, à l'aide de l'interface graphique de configuration, ajoutez les paramètres suivants:

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB 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>

Lire la suite ici

15
Iman Sedighi

Ce n'est peut-être pas la solution que vous recherchez, mais une autre option pourrait être d'utiliser AWS CloudFront en plus d'ELB. CloudFront offre la possibilité de rediriger tout le trafic HTTP entrant vers HTTPS.

4
MojoJojo

Les solutions htaccess ci-dessus ont provoqué l'échec de la vérification de l'état de santé ELB. J'ai eu du mal à trouver la solution avant de découvrir un article en ligne dans lequel quelqu'un avait les mêmes problèmes que moi. Sa solution a été d’ajouter ceci au début du fichier htaccess:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Pour autoriser cela et d'autres requêtes locales via HTTP lors de la redirection de requêtes externes via ELB vers HTTPS, ajustez la condition de réécriture afin qu'elle corresponde à http au lieu d'une concordance négative à https.

Source: redirection de HTTP vers HTTPS avec AWS et ELB

3
omikes

J'ai eu un problème étrange avec la configuration nginx et ELB. Ma configuration incluait 3 services différents dans un nginx derrière ELB. Et j’avais un problème de contenu mixte: lorsque votre demande à ELB est https, mais uniquement dans http ELB et que le serveur crée un chemin relatif vers statique à l’aide de http, le navigateur échoue avec le problème de "contenu mixte". Et je dois créer une solution pour le travail http/https sans aucune redirection.

Voici la configuration située dans le dossier nginx/conf.d/:

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

Cela signifie que nous saurons ce qu'est le véritable protocole client. Comme vous pouvez le constater, nous l’aurons dans $switch Var. Et à ce moment, vous l'utilisez dans tous les endroits où vous en avez besoin:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

Avec le réglage HTTPS, l'application php détectera automatiquement le bon protocole et construira avec précaution le chemin relatif pour éviter les problèmes de contenu mixte.

Meilleures salutations.

3
Oleg Mykolaichenko

Basé sur la réponse de @ Ulli Si vous souhaitez le configurer avec Terraform , voici un exemple>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

Source

1
user4912329