Corregiu l'error La sol·licitud HTTP senzilla es va enviar al port HTTPS a Nginx


En aquest article, mostrarem com resoldre la \400 sol·licitud incorrecta: la sol·licitud HTTP senzilla s'ha enviat al port HTTPS al servidor HTTP Nginx. Aquest error normalment sorgeix quan intenteu configurar Nginx per gestionar les sol·licituds HTTP i HTTPS.

Als efectes d'aquesta guia, estem considerant un escenari en què nginx serveix diversos llocs web implementats mitjançant amfitrions virtuals a Apache) només un lloc web utilitza SSL i la resta no.

També considerarem la configuració SSL d'exemple a continuació (hem canviat el nom de domini real per motius de seguretat), que diu a nginx que escolti tant el port 80 com el 443. I totes les sol·licituds a HTTP s'han de redirigir a HTTPS per defecte.

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

Utilitzant la configuració anterior, un cop un client intenti accedir al vostre lloc a través del port 80, és a dir, http://example.com, l'error en qüestió es mostrarà com a la captura de pantalla següent.

Trobeu aquest error perquè cada vegada que un client intenta accedir al vostre lloc mitjançant HTTP, la sol·licitud es redirigeix a HTTPS. És perquè el nginx espera que SSL s'utilitzi a la transacció, però la sol·licitud original (rebuda a través del port 80) era HTTP senzill, es queixa de l'error.

D'altra banda, si un client utilitza https://example.com, no trobarà l'error anterior. A més, si teniu altres llocs web configurats per no utilitzar SSL, nginx intentarà utilitzar HTTPS de manera predeterminada per a ells, donant lloc a l'error anterior.

Per corregir aquest error, comenta la línia següent a la teva configuració o desactiva-la.

#ssl on 
OR
ssl off

Desa i tanca el fitxer. A continuació, reinicieu el servei nginx.

# systemctl restart nginx
OR
$ sudo systemctl restart nginx

D'aquesta manera, podeu habilitar nginx per gestionar les sol·licituds HTTP i HTTPS per a diversos blocs de servidors.

Finalment, a continuació es mostra una llista d'articles sobre la configuració de SSL HTTPS en distribucions comunes de Linux i FreeBSD.

  1. Configurar HTTPS amb el certificat SSL de Let's Encrypt per a Nginx a RHEL/CentOS
  2. Protegiu Nginx amb el certificat SSL gratuït de Let's Encrypt a Ubuntu i Debian
  3. Com protegir Nginx amb SSL i xifrem a FreeBSD

Això és tot per ara. Si coneixeu alguna altra manera de resoldre aquest error, feu-nos-ho saber mitjançant el formulari de comentaris que trobareu a continuació.