Website-Suche

Behebung des Fehlers „Die einfache HTTP-Anfrage wurde an den HTTPS-Port gesendet“ in Nginx


In diesem Artikel zeigen wir, wie man das Problem „400 Bad Request: The plain HTTP request was sent to HTTPS port“ im Nginx-HTTP-Server löst. Dieser Fehler tritt normalerweise auf, wenn Sie versuchen, Nginx für die Verarbeitung von HTTP- und HTTPS-Anfragen zu konfigurieren.

Für den Zweck dieses Leitfadens betrachten wir ein Szenario, in dem Nginx mehrere Websites bedient, die über Serverblöcke (oder virtuelle Hosts in Apache) implementiert werden, wobei nur eine Website SSL verwendet und der Rest nicht.

Lesen Sie auch: Der ultimative Leitfaden zum Sichern, Härten und Verbessern der Leistung von Nginx

Wir werden auch die folgende Beispiel-SSL-Konfiguration betrachten (wir haben den tatsächlichen Domänennamen aus Sicherheitsgründen geändert), die Nginx anweist, sowohl Port 80 als auch 443 abzuhören. Und alle Anfragen über HTTP sollten standardmäßig auf HTTPS umgeleitet werden.

Nginx-Beispielkonfiguration

server{
        listen 80;
        server_name example.com www.example.com;
        return 301 https://www.example.com$request_uri;
}
server {
        listen 443 ssl http2;
        server_name example.com www.example.com;

        root   /var/www/html/example.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example.com/example.com_access_log;
        error_log   /var/log/nginx/example.com/example.com_error_log   error;

        # SSL/TLS configs
        ssl on;
        ssl_certificate /etc/ssl/certs/example_com_cert_chain.crt;
        ssl_certificate_key /etc/ssl/private/example_com.key;

        include /etc/nginx/ssl.d/ssl.conf;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/html/example.com/;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {

                root   /var/www/html/example.com/;
                fastcgi_pass   127.0.0.1:9001;
                #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

Sobald ein Client mit der obigen Konfiguration versucht, über Port 80, also http://example.com, auf Ihre Website zuzugreifen, wird der betreffende Fehler wie folgt angezeigt Bildschirmfoto.

Dieser Fehler tritt auf, weil jedes Mal, wenn ein Client versucht, über HTTP auf Ihre Website zuzugreifen, die Anfrage an HTTPS umgeleitet wird. Da der Nginx erwartet, dass SSL in der Transaktion verwendet wird, die ursprüngliche Anfrage (über Port 80 empfangen) jedoch reines HTTP war, beschwert er sich mit dem Fehler.

Wenn ein Client hingegen https://example.com verwendet, tritt der obige Fehler nicht auf. Wenn Sie außerdem andere Websites so konfiguriert haben, dass sie kein SSL verwenden, versucht Nginx, für diese standardmäßig HTTPS zu verwenden, was zu dem oben genannten Fehler führt.

Um diesen Fehler zu beheben, kommentieren Sie die Zeile unten in Ihrer Konfiguration aus oder deaktivieren Sie sie.

#ssl on 
OR
ssl off

Speichern und schließen Sie die Datei. Starten Sie dann den Nginx-Dienst neu.

systemctl restart nginx
OR
sudo systemctl restart nginx

Auf diese Weise können Sie nginx in die Lage versetzen, sowohl HTTP- als auch HTTPS-Anfragen für mehrere Serverblöcke zu verarbeiten.

Abschließend finden Sie unten eine Liste von Artikeln zum Einrichten von SSL HTTPS auf gängigen Linux-Distributionen und FreeBSD.

  1. Einrichten von HTTPS mit Let’s Encrypt SSL-Zertifikat für Nginx unter RHEL/CentOS
  2. Sichern Sie Nginx mit dem kostenlosen Let’s Encrypt SSL-Zertifikat auf Ubuntu und Debian
  3. So sichern Sie Nginx mit SSL und Let’s Encrypt in FreeBSD

Das ist alles für den Moment. Wenn Sie eine andere Möglichkeit kennen, diesen Fehler zu beheben, teilen Sie uns dies bitte über das unten stehende Feedback-Formular mit.