Vyhledávání na webu

Oprava „Prostý požadavek HTTP byl odeslán na port HTTPS“ Chyba v Nginx


V tomto článku si ukážeme, jak vyřešit „400 špatný požadavek: Na port HTTPS byl odeslán prostý HTTP požadavek“ na serveru Nginx HTTP. K této chybě obvykle dochází, když se pokusíte nakonfigurovat Nginx tak, aby zpracovával požadavky HTTP i HTTPS.

Pro účely této příručky zvažujeme scénář, ve kterém nginx obsluhuje více webových stránek implementovaných prostřednictvím serverových bloků (nebo virtuálních hostitelů v Apache), pouze jeden web používá SSL a ostatní ne.

Přečtěte si také: Nejlepší průvodce zabezpečením, zpevněním a zlepšením výkonu Nginx

Zvážíme také ukázkovou konfiguraci SSL níže (z bezpečnostních důvodů jsme změnili skutečný název domény), která říká nginx, aby naslouchal jak portu 80, tak 443. A všechny požadavky na HTTP by měly být standardně přesměrovány na HTTPS.

Ukázková konfigurace 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;
        #}
}

Při použití výše uvedené konfigurace, jakmile se klient pokusí o přístup k vašemu webu přes port 80, tj. http://example.com, zobrazí se příslušná chyba jako v následujícím Snímek obrazovky.

K této chybě dochází, protože pokaždé, když se klient pokusí o přístup k vašemu webu přes HTTP, je požadavek přesměrován na HTTPS. Je to proto, že nginx očekává, že v transakci bude použito SSL, ale původní požadavek t (přijatý přes port 80) byl prostý HTTP, stěžuje si na chybu.

Na druhou stranu, pokud klient používá https://example.com, nenarazí na výše uvedenou chybu. Kromě toho, pokud máte jiné webové stránky nakonfigurované tak, aby nepoužívaly SSL, nginx se pro ně pokusí standardně používat HTTPS, což vede k výše uvedené chybě.

Chcete-li tuto chybu opravit, zakomentujte řádek níže ve své konfiguraci nebo jej nastavte na vypnuto.

#ssl on 
OR
ssl off

Uložte a zavřete soubor. Poté restartujte službu nginx.

systemctl restart nginx
OR
sudo systemctl restart nginx

Tímto způsobem můžete povolit, aby nginx zpracovával požadavky HTTP i HTTPS pro více bloků serveru.

Nakonec níže je seznam článků o nastavení SSL HTTPS na běžných distribucích Linuxu a FreeBSD.

  1. Nastavení HTTPS pomocí Let's Encrypt SSL certifikátu pro Nginx na RHEL/CentOS
  2. Zabezpečte Nginx pomocí bezplatného certifikátu Let’s Encrypt SSL na Ubuntu a Debianu
  3. Jak zabezpečit Nginx pomocí SSL a Let's Encrypt ve FreeBSD

To je prozatím vše. Pokud víte o jiném způsobu, jak tuto chybu vyřešit, dejte nám prosím vědět prostřednictvím formuláře pro zpětnou vazbu níže.