143 votes

Traitement de l'erreur nginx 400 "La demande HTTP en clair a été envoyée au port HTTPS".

J'exécute une application Sinatra derrière passenger/nginx. J'essaie de faire en sorte qu'elle réponde à la fois aux appels http et https. Le problème est que, lorsque les deux sont définis dans le bloc serveur, les appels https sont traités normalement, mais les appels http produisent une erreur 400 "La demande HTTP simple a été envoyée au port HTTPS". Il s'agit d'une page statique, donc je suppose que Sinatra n'a rien à voir avec cela. Avez-vous des idées sur la façon de résoudre ce problème ?

Voici le bloc du serveur :

server {
        listen 80;
        listen 443  ssl;
        server_name localhost;
        root /home/myhome/app/public;
        passenger_enabled on;

        ssl on;
        ssl_certificate      /opt/nginx/ssl_keys/ssl.crt;
        ssl_certificate_key  /opt/nginx/ssl_keys/ssl.key;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          HIGH:!aNULL:!MD5;

        location /static {
            root  /home/myhome/app/public;
            index  index.html index.htm index.php;
        }

        error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 /500.html;

        access_log /home/myhome/app/logs/access.log;
        error_log /home/myhome/app/logs/error.log;
}

206voto

bobojam Points 851

J'ai rencontré un problème similaire. Il fonctionne sur un serveur et ne fonctionne pas sur un autre serveur avec la même configuration Nginx. J'ai trouvé la solution qui est répondue par Igor ici http://forum.nginx.org/read.php?2,1612,1627#msg-1627

Oui. Ou vous pouvez combiner des serveurs SSL/non-SSL dans un seul serveur :

server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}

53voto

Les réponses ci-dessus sont incorrectes dans la mesure où la plupart d'entre elles passent outre le test "is this connection HTTPS" pour permettre de servir les pages par http sans tenir compte de la sécurité de la connexion.

La réponse sécurisée utilise une page d'erreur sur un code d'erreur http 4xx spécifique à NGINX pour rediriger le client afin qu'il réessaie la même requête vers https (comme indiqué ici). https://serverfault.com/questions/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )

Le PO devrait utiliser :

server {
  listen        12345;
  server_name   php.myadmin.com;

  root         /var/www/php;

  ssl           on;

  # If they come here using HTTP, bounce them to the correct scheme
  error_page 497 https://$server_name:$server_port$request_uri;

  [....]
}

18voto

Alexander Azarov Points 6630

L'erreur dit tout en fait. Votre configuration indique à Nginx d'écouter sur le port 80 (HTTP) et d'utiliser SSL. Lorsque vous pointez votre navigateur vers http://localhost il tente de se connecter via HTTP. Comme Nginx s'attend à du SSL, il se plaint avec l'erreur.

La solution de contournement est très simple. Vous avez besoin de deux server sections :

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}

12voto

Remiz Points 113

J'ai eu exactement le même problème, j'ai un peu la même configuration que votre exemple et j'ai réussi à le faire fonctionner en supprimant la ligne :

ssl on;

Pour citer le docteur :

Si les serveurs HTTP et HTTPS sont égaux, un seul serveur qui traite à la fois les demandes HTTP et HTTPS peut être configuré en supprimant la directive "ssl on" et en ajoutant le paramètre ssl pour le port *:443

4voto

Si vous utilisez phpmyadmin, ajoutez : fastcgi_param HTTPS on ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X