14 votes

réécriture de http en https avec ngnix derrière un équilibreur de charge

J'utilise un équilibreur de charge Rackspace qui me permet de configurer ma clé ssl/pem à l'intérieur du panneau d'administration. Tout fonctionne bien, je peux utiliser les protocoles http et https. Mais si j'essaie de rediriger http vers https en utilisant :

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

...j'obtiens une boucle de redirection. Je réalise que je n'écoute pas le port 443, mais c'est parce que l'équilibreur de charge s'en est occupé pour moi. J'ai également essayé d'envelopper la réécriture dans un fichier if ($scheme ~* http){ en vain.

L'autre partie de ma question est que je voudrais supprimer le www de l'url, puis-je le faire avec une seule réécriture ? La réécriture ci-dessus ne devrait-elle pas s'en charger également ?

Merci pour votre aide !

27voto

user226357 Points 11

En utilisant les variables de serveur intégrées de nginx $request_uri y $server_name vous pouvez le faire sans utiliser d'expressions régulières du tout. Ajoutez les éléments suivants au fichier location et vous avez terminé :

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

Cela suppose que votre répartiteur de charge envoie le fichier $http_x_forwarded_proto avec la demande à votre (vos) instance(s) dorsale(s). Les autres en-têtes courants sont $http_x_forwarded_scheme et aussi juste $scheme .

Plus d'informations peuvent être trouvées dans le document nginx Pièges et erreurs courantes documentation : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites

15voto

slade Points 309

Sciurus a raison : les équilibreurs de charge en nuage de Rackspace définissent le X-Forwarded-Proto sur https lorsque SSL est déchargé au niveau de l'équilibreur de charge. Afin d'éviter une boucle de redirection dans nginx, vous devriez pouvoir ajouter ce qui suit à la section location dans la configuration du serveur virtuel :

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

Cela devrait éviter la boucle de redirection infinie lors de la redirection des demandes non-https vers https.

1voto

Kasper Holdum Points 4173

L'équilibreur de charge vous parle toujours par http. Ce qui se passe, c'est que

  1. Le navigateur envoie une requête au port 80 de l'équilibreur de charge.
  2. L'équilibreur de charge envoie une requête au port 80 de votre serveur Web.
  3. Votre serveur web envoie une redirection à l'utilisateur.
  4. L'utilisateur effectue une requête sur le port 443 de l'équilibreur de charge.

Les étapes 2 à 4 se répètent jusqu'à ce que le navigateur détecte la boucle de redirection et abandonne.

EDIT : Pour résoudre ce problème, n'effectuez la réécriture que lorsque l'en-tête X-Forwarded-Proto est défini sur http. Cet en-tête est la façon dont l'équilibreur de charge de Rackspace indique à votre serveur Web le protocole par lequel il a reçu la demande.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X