Lagfærðu „Einláta HTTP beiðnin var send á HTTPS tengi“ Villa í Nginx


Í þessari grein munum við sýna hvernig á að leysa \400 slæma beiðni: Hin látlausa HTTP beiðni var send á HTTPS tengi í Nginx HTTP miðlara. Þessi villa kemur venjulega upp þegar þú reynir að stilla Nginx til að meðhöndla bæði HTTP og HTTPS beiðnir.

Í tilgangi þessarar handbókar erum við að íhuga atburðarás þar sem nginx þjónar mörgum vefsíðum sem eru útfærðar í gegnum sýndargestgjafa í Apache) aðeins ein vefsíða notar SSL og restin ekki.

Við munum einnig íhuga sýnishorn SSL stillingar hér að neðan (við höfum breytt raunverulegu léninu af öryggisástæðum), sem segir nginx að hlusta á bæði höfn 80 og 443. Og allar beiðnir um HTTP ætti að vera sjálfgefið að vísa til HTTPS.

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

Með því að nota ofangreindar stillingar, þegar viðskiptavinur reynir að komast inn á síðuna þína í gegnum port 80, þ.e. http://example.com, mun viðkomandi villa birtast eins og á eftirfarandi skjámynd.

Þú lendir í þessari villu vegna þess að í hvert sinn sem viðskiptavinur reynir að komast inn á síðuna þína í gegnum HTTP er beiðninni vísað á HTTPS. Það er vegna þess að nginx býst við að SSL verði notað í viðskiptunum en upprunalegu beiðnirnar (mótteknar um höfn 80) voru venjuleg HTTP, það kvartar undan villunni.

Á hinn bóginn, ef viðskiptavinur notar https://example.com, mun hann ekki lenda í ofangreindri villu. Að auki, ef þú ert með aðrar vefsíður stilltar til að nota ekki SSL, mun nginx reyna að nota HTTPS sjálfgefið fyrir þær sem leiðir til villunnar hér að ofan.

Til að laga þessa villu skaltu skrifa athugasemd við línuna hér að neðan í stillingunum þínum eða slökkva á henni.

#ssl on 
OR
ssl off

Vistaðu og lokaðu skránni. Endurræstu síðan nginx þjónustuna.

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

Þannig geturðu gert nginx kleift að meðhöndla bæði HTTP og HTTPS beiðnir fyrir margar netþjónablokkir.

Að lokum, hér að neðan er listi yfir greinar um uppsetningu SSL HTTPS á algengum Linux dreifingum og FreeBSD.

  1. Setja upp HTTPS með Let's Encrypt SSL Certificate For Nginx á RHEL/CentOS
  2. Öryggið Nginx með ókeypis Let's Encrypt SSL Certificate á Ubuntu og Debian
  3. Hvernig á að tryggja Nginx með SSL og við skulum dulkóða í FreeBSD

Það er allt í bili. Ef þú veist um aðra leið til að leysa þessa villu, vinsamlegast láttu okkur vita í gegnum athugasemdaformið hér að neðan.