Je souhaite rediriger toute la requête HTTP vers la requête https sur ELB . J'ai deux instances EC2. J'utilise nginx pour le serveur. J'ai essayé de réécrire les fichiers nginx conf sans aucun succès. J'aimerais avoir des conseils à ce sujet.
Je souhaite rediriger toute la requête HTTP vers la requête https sur ELB . J'ai deux instances EC2. J'utilise nginx pour le serveur. J'ai essayé de réécrire les fichiers nginx conf sans aucun succès. J'aimerais avoir des conseils à ce sujet.
Réponses:
Les AWS Application Load Balancers prennent désormais en charge la redirection native HTTP vers HTTPS.
Pour activer cela dans la console, procédez comme suit:
La même chose peut être obtenue en utilisant la CLI comme décrit ici .
Il est également possible de le faire dans Cloudformation, où vous devez configurer un objet Listener comme celui-ci:
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 les Classic Load Balancers, optez pour l'une des configurations NGINX décrites par les autres.
instances
tabulation)
ELB définit l'en- X-Forwarded-Proto
tête, vous pouvez l'utiliser pour détecter si la demande d'origine était vers HTTP et rediriger vers HTTPS ensuite.
Vous pouvez essayer ceci dans votre server
conf:
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
Jetez un œil à la documentation ELB .
nginx
configuration, mais le principe est applicable à n'importe quel serveur Web.
J'ai eu le même problème, dans ma situation, HTTPS était entièrement géré par ELB et je ne connaissais pas mon domaine source à l'avance, alors 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 pointant l'ELB 'https' vers le port d'instance 80, puis la route 'http' vers le port d'instance 81.
Amazon Elastic Load Balancer (ELB) prend en charge un en-tête HTTP appelé X-FORWARDED-PROTO. Toutes les requêtes HTTPS passant par l'ELB auront la valeur X-FORWARDED-PROTO égale à «HTTPS». Pour les requêtes HTTP, vous pouvez forcer HTTPS en ajoutant la règle de réécriture simple suivante. Pour moi, cela fonctionne 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 dans le même serveur Web EC2, vous pouvez ajouter ce qui suit au vhost.conf (ajoutez-le au domaine que vous souhaitez utiliser https pour cela):
<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>
IIS
Installez le module IIS Url-Rewrite, en utilisant l'interface graphique de configuration, ajoutez ces paramètres:
<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>
En savoir plus ici
RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
Les solutions htaccess ci-dessus ont provoqué l'échec de la vérification de l'état ELB. J'ai eu du mal à trouver la solution jusqu'à ce que je découvre un article en ligne dans lequel quelqu'un avait les mêmes problèmes que moi. Sa solution était d'ajouter ceci au début du fichier htaccess à la place:
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 tout en redirigeant les requêtes externes via ELB vers HTTPS, ajustez la condition de réécriture pour qu'elle corresponde sur http au lieu d'une correspondance négative sur https.
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.
J'ai eu un problème étrange avec la configuration nginx et ELB. Ma configuration comprenait 3 services différents à l'intérieur d'un nginx derrière ELB. Et j'ai eu un problème de contenu mixte: lorsque votre demande à ELB est https, mais à l'intérieur d'ELB http uniquement, et que le serveur crée un chemin relatif vers statique en utilisant http, le navigateur échoue donc avec un problème de `` contenu mixte ''. Et je dois créer une solution pour que les deux http / https fonctionnent sans aucune redirection.
Voici la configuration située dans le nginx/conf.d/
dossier:
# 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 voir, nous l'aurons dans $switch
var. Et en 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 paramètre HTTPS, l'application php détectera automatiquement le bon protocole et construira soigneusement 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"
}
}
}
Créez un fichier .ebextensions/00_forward_http_to_https.config
avec le contenu suivant:
files:
/tmp/deployment/http_redirect.sh:
mode: "000755"
content: |
APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
container_commands:
http_redirect:
command: "/tmp/deployment/http_redirect.sh"
Assurez-vous de définir au préalable la variable d'environnement APP_URL à partir de la console de gestion AWS.