Labojiet kļūdu “Vienkāršais HTTP pieprasījums tika nosūtīts uz HTTPS portu” kļūdu Nginx


Šajā rakstā mēs parādīsim, kā atrisināt “400 nepareizu pieprasījumu: vienkāršs HTTP pieprasījums tika nosūtīts uz HTTPS portu” Nginx HTTP serverī. Šī kļūda parasti rodas, mēģinot konfigurēt Nginx apstrādāt gan HTTP, gan HTTPS pieprasījumus.

Šīs rokasgrāmatas nolūkā mēs apsveram scenāriju, kurā nginx apkalpo vairākas vietnes, kas tiek ieviestas, izmantojot Apache virtuālos resursdatorus) tikai viena vietne izmanto SSL, bet pārējās neizmanto.

Mēs apsvērsim arī zemāk esošo SSL konfigurācijas paraugu (drošības apsvērumu dēļ esam mainījuši faktisko domēna nosaukumu), kas norāda nginx klausīties gan 80., gan 443. portu. Un visi HTTP pieprasījumi pēc noklusējuma jāpāradresē uz 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;
        #}
}

Izmantojot iepriekš minēto konfigurāciju, tiklīdz klients mēģina piekļūt jūsu vietnei, izmantojot 80. portu, ti, http://example.com , attiecīgā kļūda tiks parādīta tāpat kā nākamajā ekrānuzņēmumā.

Jums rodas šī kļūda, jo katru reizi, kad klients mēģina piekļūt jūsu vietnei, izmantojot HTTP, pieprasījums tiek novirzīts uz HTTPS. Tā kā nginx sagaida, ka darījumā tiks izmantots SSL, tomēr sākotnējie pieprasījumi (saņemti caur 80. portu) bija vienkārši HTTP, tas sūdzas par kļūdu.

No otras puses, ja klients izmanto https://example.com , viņš neredzēs iepriekš minēto kļūdu. Turklāt, ja jums ir citas vietnes, kas konfigurētas neizmantot SSL, nginx pēc noklusējuma mēģinās tām izmantot HTTPS, kā rezultātā rodas iepriekš minētā kļūda.

Lai novērstu šo kļūdu, komentējiet tālāk esošo rindu savā konfigurācijā vai izslēdziet to.

#ssl on 
OR
ssl off

Saglabājiet un aizveriet failu. Pēc tam restartējiet nginx pakalpojumu.

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

Tādā veidā jūs varat iespējot nginx apstrādāt gan HTTP, gan HTTPS pieprasījumus vairākiem serveru blokiem.

Visbeidzot, zemāk ir saraksts ar rakstiem par SSL HTTPS iestatīšanu parastajos Linux izplatījumos un FreeBSD.

  1. HTTPS iestatīšana, šifrējot Nginx SSL sertifikātu vietnē RHEL/CentOS
  2. Nodrošiniet Nginx ar bezmaksas Let’s Encrypt SSL Certificate Ubuntu un Debian
  3. Kā nodrošināt Nginx ar SSL un šifrēt FreeBSD

Tas pagaidām ir viss. Ja zināt kādu citu veidu, kā novērst šo kļūdu, lūdzu, informējiet mūs, izmantojot tālāk sniegto atsauksmju veidlapu.