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.
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:
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.
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 .
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.
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
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.
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.
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.
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"
}
}
}