Question Nginx: Détecter la connexion HTTPS à l'aide d'un en-tête


Sur mon équilibreur de charge, je termine les connexions HTTPS avec Nginx, puis envoie la requête à l'un des serveurs Web également sauvegardés par Nginx.

Sur l'équilibreur de charge dans fastcgi_params, j'ai:

fastcgi_param   HTTPS   $https;

Sur les serveurs Web, il existe un site accessible uniquement par HTTPS. Comment puis-je détecter si le paramètre HTTPS est défini et s'il n'est pas redirigé vers la version sécurisée du site?


5
2017-07-31 22:00


origine




Réponses:


Si je vous comprends bien, votre configuration ressemble à ceci:

client - (http / https) -> nginx (avant) - (http) -> nginx (retour) - (fastcgi) -> application

Il existe actuellement 3 endroits différents où la redirection peut être effectuée:

Sur votre serveur Nginx frontal, vous pouvez simplement effectuer la redirection en cas de besoin:

if ( $https != 'on' ) {
  return 301 https://$host$request_uri;
}

Si vous ne pouvez pas le faire sur le serveur Nginx avant, vous devez transporter des informations sur le protocole utilisé pour sauvegarder l’instance Nginx. La méthode habituelle consiste à utiliser l'en-tête X-Forwarded-Proto. Vous devez ajouter à la place appropriée sur votre serveur Nginx frontal:

proxy_set_header X-Forwarded-Proto $scheme;

Ensuite, vous pouvez effectuer une redirection sur le serveur Nginx:

if ( $http_x_forwarded_proto != 'https' ) {
  return 301 https://$host$request_uri;
}

De toute évidence, vous pouvez également gérer la redirection à l'intérieur de l'application. Vous devriez avoir l'en-tête X-Forwarded-Proto disponible dans l'application, ou vous pouvez le définir comme paramètre fastcgi:

Quelque part dans http {}

map $http_x_forwarded_proto $fe_https {
  default off;
  https on;
}

Et cartographie supplémentaire:

fastcgi_param   HTTPS $fe_https;

Personnellement, je pense que la redirection devrait être faite aussi tôt que possible dans une chaîne.


16
2017-07-31 23:33