web-dev-qa-db-fra.com

Traitement de nginx 400 "Erreur" La requête HTTP simple a été envoyée au port HTTPS "

Je lance une application Sinatra derrière le passager/nginx. J'essaie de le faire répondre aux appels http et https. Le problème est que, lorsque les deux sont définis dans le bloc de serveur, on répond normalement aux appels https, mais http génère une erreur 400 "La requête HTTP simple a été envoyée au port HTTPS". Ceci est pour une page statique donc je suppose que Sinatra n’a rien à voir avec cela. Des idées pour résoudre le problème?

Voici le bloc 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;
}
104
Johnny

J'ai rencontré un problème similaire. Cela fonctionne sur un serveur et non sur un autre serveur avec la même configuration Nginx. Trouvé la solution à laquelle répond Igor ici http://forum.nginx.org/read.php?2,1612,1627#msg-1627

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

server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}
189
bobojam

Les réponses ci-dessus sont incorrectes en ce sens que le test "est-ce que cette connexion HTTPS" permet de servir les pages sur http indépendamment de la sécurité de la connexion.

Réponse sécurisée utilisant une page d'erreur sur un code d'erreur http 4xx spécifique à NGINX pour rediriger le client afin de réessayer la même demande en https. (comme indiqué ici https://serverfault.com/questions/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )

Le PO doit 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://$Host:$server_port$request_uri;

  [....]
}
31
Michael J. Evans

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

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

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}
17
Alexander Azarov

J'ai eu exactement le même problème, j'ai un peu la même configuration que votre exemple et je l'ai obtenu en supprimant la ligne:

ssl on;

Pour citer le doc:

Si les serveurs HTTP et HTTPS sont égaux, vous pouvez configurer un seul serveur gérant les demandes HTTP et HTTPS en supprimant la directive "ssl on" et en ajoutant le paramètre ssl pour le port *: 443.

12
Remiz

Selon article de Wikipédia sur les codes d'état . Nginx a un code d'erreur personnalisé lorsque le trafic http est envoyé au port https (code d'erreur 497)

Et conformément à nginx docs sur error_page , vous pouvez définir un URI qui sera affiché pour une erreur spécifique.
Ainsi, nous pouvons créer un URI auquel les clients seront envoyés lorsque le code d'erreur 497 sera généré.

nginx.conf

#lets assume your IP address is 89.89.89.89 and also 
#that you want nginx to listen on port 7000 and your app is running on port 3000

server {
    listen 7000 ssl;

    ssl_certificate /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate_key.key;
    ssl_client_certificate /path/to/ssl_client_certificate.cer;

    error_page 497 301 =307 https://89.89.89.89:7000$request_uri;

    location / {
        proxy_pass http://89.89.89.89:3000/;

        proxy_pass_header Server;
        proxy_set_header Host $http_Host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Protocol $scheme;
    }
}

Toutefois, si un client fait une demande via une autre méthode, à l'exception d'un GET, cette demande sera transformée en un GET. Donc, pour conserver la méthode de requête par laquelle le client est entré; nous utilisons les redirections de traitement des erreurs comme indiqué dans Les documents nginx sur error_page

Et c’est pourquoi nous utilisons la redirection 301 =307.

En utilisant le fichier nginx.conf montré ici, nous pouvons avoir http et https écouter sur le même port

11
Komu

Voici un exemple pour config HTTP et HTTPS dans même bloc de configuration avec support ipv6 . La configuration est testée sur Ubuntu Server et NGINX/1.4.6 mais cela devrait fonctionner avec tous les serveurs.

server {
    # support http and ipv6
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    # support https and ipv6
    listen 443 default_server ssl;
    listen [::]:443 ipv6only=on default_server ssl;

    # path to web directory
    root /path/to/example.com;
    index index.html index.htm;

    # domain or subdomain
    server_name example.com www.example.com;

    # ssl certificate
    ssl_certificate /path/to/certs/example_com-bundle.crt;
    ssl_certificate_key /path/to/certs/example_com.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;
}

N'incluez pas ssl on qui pourrait provoquer une erreur 400. La configuration ci-dessus devrait fonctionner pour

http://example.com

http://www.example.com

https://example.com

https://www.example.com

J'espère que cela t'aides!

7
Madan Sapkota

si vous utilisez phpmyadmin, ajoutez: fastcgi_param HTTPS on;

4
Rodrigo Gregorio

En fait, vous pouvez le faire avec:

ssl off; 

Cela a résolu mon problème en utilisant nginxvhosts; Maintenant, je suis capable d'utiliser à la fois SSL et HTTP. Fonctionne même avec des ports combinés.

4
rapan iosif

Ref https://serversforhackers.com/c/redirect-http-to-https-nginx

j'avais des problèmes similaires, comme

http://www.example.com donnant 400 error The plain HTTP request was sent to HTTPS mais

si je tape https://www.example.com cela fonctionnait bien,

je voulais slove et rediriger http vers https automatiquement lorsque l'utilisateur saisit http://www.example.com

la solution est

j'ai fait deux blocs de serveur un pour le port 80 et un autre pour 443 ssl dans le bloc 80 suivre la procédure ci-dessous

server {
    listen 80;

    server_name example.com, www.example.com;

    return 301 https://$Host$request_uri;
}

et un autre bloc serveur pour le port 443 pour la configuration SSL

server {
    location = /favicon.ico { access_log off; log_not_found off; }


    listen [::]:443 ipv6only=on default_server ssl;
    listen 443 ssl;
    ssl on;
    ssl_certificate /home/hemanth/examp_com/example.crt;
    ssl_certificate_key /home/hemanth/ssl/example.com.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name www.example.com;
    // continure rest code...
} 
0
giveJob