it-swarm.com.de

Umgang mit Nginx 400 "Die einfache HTTP-Anforderung wurde an den HTTPS-Port gesendet" Fehler

Ich verwende eine Sinatra-App hinter Passenger/Nginx. Ich versuche, es zu veranlassen, auf http- und https-Anrufe zu antworten. Das Problem ist, wenn beide im Serverblock definiert sind, werden https-Aufrufe normal beantwortet, aber http liefert den Fehler 400 "Die einfache HTTP-Anforderung wurde an den HTTPS-Port gesendet". Dies ist für eine statische Seite, also denke ich, dass Sinatra nichts damit zu tun hat. Irgendwelche Ideen, wie das behoben werden kann?

Hier ist der Serverblock:

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

Ich bin auf ein ähnliches Problem gestoßen. Es funktioniert auf einem Server und nicht auf einem anderen Server mit derselben Nginx-Konfiguration. Gefunden die Lösung, die von Igor hier beantwortet wird http://forum.nginx.org/read.php?2,1612,1627#msg-1627

Ja. Oder Sie kombinieren SSL/Nicht-SSL-Server in einem Server:

server {
  listen 80;
  listen 443 default ssl;

  # ssl on   - remember to comment this out

}
189
bobojam

Die obigen Antworten sind insofern falsch, als die meisten den Test "Ist diese Verbindung HTTPS" außer Kraft setzen, um das Versenden der Seiten über http ungeachtet der Verbindungssicherheit zu ermöglichen.

Die sichere Antwort unter Verwendung einer Fehlerseite auf einem NGINX-spezifischen http 4xx-Fehlercode, um den Client weiterzuleiten und dieselbe Anfrage erneut an https zu senden. (wie hier beschrieben https://serverfault.com/questions/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )

Das OP sollte verwenden:

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

Der Fehler sagt eigentlich schon alles. Ihre Konfiguration weist Nginx an, Port 80 (HTTP) abzuhören und SSL zu verwenden. Wenn Sie Ihren Browser auf http://localhost Zeigen, versucht er, eine Verbindung über HTTP herzustellen. Da Nginx SSL erwartet, beklagt es sich mit dem Fehler.

Die Problemumgehung ist sehr einfach. Sie benötigen zwei server Abschnitte:

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}
17

Ich hatte genau das gleiche Problem, ich habe die gleiche Konfiguration wie Ihr Beispiel und ich habe es funktioniert, indem ich die Zeile entferne:

ssl on;

So zitieren Sie das Dokument:

Wenn HTTP- und HTTPS-Server identisch sind, kann ein einzelner Server, der sowohl HTTP- als auch HTTPS-Anforderungen verarbeitet, konfiguriert werden, indem die Direktive "ssl on" gelöscht und der Parameter ssl für den *: 443-Port hinzugefügt wird

12
Remiz

Laut Wikipedia-Artikel zu Statuscodes . Nginx hat einen benutzerdefinierten Fehlercode, wenn http-Datenverkehr an den https-Port gesendet wird (Fehlercode 497).

Und laut nginx docs on error_page können Sie eine URI definieren, die für einen bestimmten Fehler angezeigt wird.
Auf diese Weise können wir eine URL erstellen, an die Clients gesendet werden, wenn der Fehlercode 497 ausgelöst wird.

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

Wenn ein Client jedoch eine Anforderung über eine andere Methode als ein GET sendet, wird diese Anforderung in ein GET umgewandelt. So erhalten Sie die Anforderungsmethode, über die der Client hereinkam; Wir verwenden Weiterleitungen zur Fehlerverarbeitung, wie in Nginx-Dokumente auf error_page gezeigt

Und deshalb verwenden wir die 301 =307 umleiten.

Mit der hier gezeigten Datei nginx.conf können http und https auf demselben Port abhören

11
Komu

Hier ist ein Beispiel für die Konfiguration von [~ # ~] http [~ # ~] und [~ # ~] https [~ # ~] im selben Konfigurationsblock mit ipv6 Unterstützung. Die Konfiguration wird in Ubuntu Server und NGINX/1.4.6 aber getestet Dies sollte mit allen Servern funktionieren.

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

Fügen Sie nicht ssl on Hinzu, da dies zu einem 400 - Fehler führen kann. Die obige Konfiguration sollte funktionieren

http://example.com

http://www.example.com

https://example.com

https://www.example.com

Hoffe das hilft!

7
Madan Sapkota

wenn Sie phpmyadmin verwenden, fügen Sie Folgendes hinzu: fastcgi_param HTTPS on;

4

Eigentlich kann man das machen mit:

ssl off; 

Dies löste mein Problem bei der Verwendung von nginxvhosts; Jetzt kann ich sowohl SSL als auch normales HTTP verwenden. Funktioniert auch mit kombinierten Ports.

4
rapan iosif

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

ich hatte ähnliche Probleme wie

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

wenn ich https://www.example.com eingebe, hat es gut funktioniert.

ich wollte, dass http automatisch zu https umgeleitet wird, wenn der Benutzer http://www.example.com eingibt

Lösung ist

ich habe zwei Serverblöcke für Port 80 und einen für 443 SSL im Port 80-Block erstellt

server {
    listen 80;

    server_name example.com, www.example.com;

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

und ein weiterer Serverblock für Port 443 für die SSL-Konfiguration

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