Korjaa "Tavallinen HTTP-pyyntö lähetettiin HTTPS-porttiin" -virhe Nginxissä
Tässä artikkelissa näytetään, kuinka ratkaista "400 huonoa pyyntöä: tavallinen HTTP-pyyntö lähetettiin HTTPS-porttiin" Nginx HTTP -palvelimessa. Tämä virhe ilmenee yleensä, kun yrität määrittää Nginxin käsittelemään sekä HTTP- että HTTPS-pyyntöjä.
Tässä oppaassa tarkastellaan skenaariota, jossa nginx palvelee useita verkkosivustoja, jotka on toteutettu virtuaalisten isäntien kautta Apachessa), vain yksi verkkosivusto käyttää SSL: ää ja loput eivät.
Harkitsemme myös alla olevaa SSL-kokoonpanomallia (olemme muuttaneet todellisen verkkotunnuksen nimen turvallisuussyistä), joka käskee nginxiä kuuntelemaan sekä portteja 80 että 443. Ja kaikki HTTP-pyynnöt tulisi ohjata oletusarvoisesti HTTPS: ään.
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; #} }
Yllä olevan kokoonpanon avulla, kun asiakas yrittää käyttää sivustoasi portin 80 kautta, ts. http://example.com
, kyseinen virhe näytetään kuten seuraavassa kuvakaappauksessa.
Saatat kohdata tämän virheen, koska joka kerta, kun asiakas yrittää käyttää sivustoasi HTTP: n kautta, pyyntö ohjataan HTTPS: ään. Koska nginx odottaa SSL: n käyttämistä tapahtumassa, mutta alkuperäiset pyynnöt t (vastaanotettu portin 80 kautta) olivat selkeät HTTP, se valitti virheestä.
Toisaalta, jos asiakas käyttää https://example.com
, hän ei näe yllä olevaa virhettä. Lisäksi, jos sinulla on muita verkkosivustoja, jotka on määritetty olemaan käyttämättä SSL: ää, nginx yrittää käyttää oletusarvoisesti HTTPS: ää, mikä johtaa yllä olevaan virheeseen.
Korjaa tämä virhe kommentoimalla kokoonpanon alla oleva rivi tai asettamalla se pois päältä.
#ssl on OR ssl off
Tallenna ja sulje tiedosto. Käynnistä sitten nginx-palvelu uudelleen.
# systemctl restart nginx OR $ sudo systemctl restart nginx
Näin voit sallia nginxin käsittelemään sekä HTTP- että HTTPS-pyyntöjä useille palvelinlohkoille.
Lopuksi, alla on luettelo artikkeleista SSL HTTPS: n asettamisesta tavallisille Linux-jakeluille ja FreeBSD: lle.
- HTTPS: n määrittäminen salaamalla Nginxin SSL-varmenne RHEL/CentOS: lla
- Suojaa Nginx Free Let’s Encrypt SSL -sertifikaatilla Ubuntussa ja Debianissa
- Kuinka suojata Nginx SSL: llä ja salataan FreeBSD: ssä
Tässä kaikki tältä erää. Jos tiedät muita tapoja ratkaista tämä virhe, ilmoita siitä meille alla olevan palautelomakkeen kautta.