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.
- Nastavení HTTPS pomocí Let's Encrypt SSL certifikátu pro Nginx na RHEL/CentOS
- Zabezpečte Nginx pomocí bezplatného certifikátu Let’s Encrypt SSL na Ubuntu a Debianu
- 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.