Concernant nginx 400" la simple requête HTTP a été envoyée au port HTTPS " erreur

J'utilise une application Sinatra derrière passenger / 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 serveur, les appels https reçoivent une réponse normale, mais que http produit une erreur 400 "la simple requête HTTP a été envoyée au port HTTPS". C'est pour une page statique donc je suppose que Sinatra n'a rien à voir avec cela. Toutes les idées sur la façon de résoudre ce 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;
}
93
demandé sur Johnny 2012-01-07 14:21:33

8 réponses

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. Trouvé la solution qui est répondu par Igor ici http://forum.nginx.org/read.php?2, 1612, 1627#msg-1627

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

server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}
179
répondu bobojam 2012-12-14 20:04:37

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

la réponse sécurisée en utilisant une page d'erreur sur un code d'erreur http 4xx spécifique à Nginx pour rediriger le client à rejouer 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 )

L'OP 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;

  [....]
}
26
répondu Michael J. Evans 2017-04-13 12:13:43

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 essaie de se connecter via HTTP. Depuis NGINX attend SSL, il se plaint de l'erreur.

la solution 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...
}
16
répondu Alexander Azarov 2012-01-07 16:36:48

j'ai eu exactement le même problème, j'ai en quelque sorte la même configuration que votre exemple et je l'ai fait fonctionner en supprimant la ligne:

ssl on;

pour citer le doc:

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

12
répondu Remiz 2012-11-22 16:33:57

selon article wikipedia sur les codes de statut . Nginx a un code d'erreur personnalisé lorsque le trafic http est envoyé au port https (code d'erreur 497)

et selon NGINX docs sur error_page , vous pouvez définir un URI qui sera affiché pour une erreur spécifique.

Ainsi, nous pouvons créer une uri qui vous sera envoyé lorsque le code d'erreur 497 est soulevée.

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;
    }
}

cependant si un client fait une requête via une autre méthode sauf un GET, cette requête sera transformée en GET. Ainsi, pour préserver la méthode de requête que le client est venu via; nous utilisons des redirections de traitement d'erreurs comme indiqué dans NGINX docs sur error_page

et c'est pourquoi nous utilisons la redirection 301 =307 .

en utilisant le nginx.fichier conf montré ici, nous sommes en mesure d'avoir http et https écouter sur la même port

11
répondu Komu 2015-02-04 13:56:01

voici un exemple de configuration HTTP et HTTPS dans le même bloc de configuration avec le support ipv6 . La configuration est testée dans 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 peut causer une erreur 400 . La configuration ci-dessus devrait fonctionner pour

http://example.com

http://www.example.com

https://example.com

https://www.example.com

Espérons que cette aide!

7
répondu Madan Sapkota 2016-01-01 04:32:10

si utiliser phpmyadmin ajouter: fastcgi_param HTTPS on;

4
répondu Rodrigo Gregorio 2012-03-31 00:11:55

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.

3
répondu rapan iosif 2013-10-10 00:03:29