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.

  1. HTTPS: n määrittäminen salaamalla Nginxin SSL-varmenne RHEL/CentOS: lla
  2. Suojaa Nginx Free Let’s Encrypt SSL -sertifikaatilla Ubuntussa ja Debianissa
  3. 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.