Wyszukiwanie w witrynie

Napraw „Zwykłe żądanie HTTP zostało wysłane do portu HTTPS” Błąd w Nginx


W tym artykule pokażemy, jak rozwiązać problem „400 Bad Request: zwykłe żądanie HTTP zostało wysłane do portu HTTPS” na serwerze HTTP Nginx. Ten błąd zwykle pojawia się, gdy próbujesz skonfigurować Nginx do obsługi żądań HTTP i HTTPS.

Na potrzeby tego przewodnika rozważamy scenariusz, w którym nginx obsługuje wiele witryn internetowych zaimplementowanych poprzez bloki serwerów (lub wirtualne hosty w Apache), tylko jedna witryna korzysta z protokołu SSL, a pozostałe nie.

Przeczytaj także: Kompletny przewodnik po zabezpieczeniu, wzmocnieniu i poprawie wydajności Nginx

Rozważymy także przykładową konfigurację SSL poniżej (ze względów bezpieczeństwa zmieniliśmy rzeczywistą nazwę domeny), która mówi nginxowi, aby nasłuchiwał zarówno na porcie 80, jak i 443. Wszystkie żądania HTTP powinny być domyślnie przekierowywane do HTTPS.

Przykładowa konfiguracja Nginx

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

Korzystając z powyższej konfiguracji, gdy klient spróbuje uzyskać dostęp do Twojej witryny przez port 80, tj. http://example.com, błąd, o którym mowa, zostanie wyświetlony jak poniżej zrzut ekranu.

Występuje ten błąd, ponieważ za każdym razem, gdy klient próbuje uzyskać dostęp do Twojej witryny za pośrednictwem protokołu HTTP, żądanie jest przekierowywane do protokołu HTTPS. Dzieje się tak, ponieważ nginx oczekuje użycia protokołu SSL w transakcji, ale pierwotne żądanie t (otrzymane przez port 80) było zwykłym HTTP, skarży się na błąd.

Z drugiej strony, jeśli klient użyje https://example.com, nie napotka powyższego błędu. Ponadto, jeśli masz inne strony internetowe skonfigurowane tak, aby nie korzystały z protokołu SSL, nginx spróbuje domyślnie użyć dla nich protokołu HTTPS, co spowoduje powyższy błąd.

Aby naprawić ten błąd, skomentuj poniższą linię w swojej konfiguracji lub wyłącz ją.

#ssl on 
OR
ssl off

Zapisz i zamknij plik. Następnie uruchom ponownie usługę nginx.

systemctl restart nginx
OR
sudo systemctl restart nginx

W ten sposób możesz włączyć nginx obsługę żądań HTTP i HTTPS dla wielu bloków serwerów.

Na koniec poniżej znajduje się lista artykułów na temat konfigurowania SSL HTTPS w popularnych dystrybucjach Linuksa i FreeBSD.

  1. Konfigurowanie HTTPS z certyfikatem Let's Encrypt SSL dla Nginx na RHEL/CentOS
  2. Zabezpiecz Nginx za pomocą bezpłatnego certyfikatu Let’s Encrypt SSL na Ubuntu i Debianie
  3. Jak zabezpieczyć Nginx za pomocą protokołu SSL i szyfrowania w FreeBSD

To wszystko na teraz. Jeśli znasz inny sposób rozwiązania tego błędu, daj nam znać, korzystając z poniższego formularza opinii.