Nginx'te "Düz HTTP isteği HTTPS bağlantı noktasına gönderildi" Hatası düzeltildi


Bu yazımızda Nginx HTTP sunucusunda “400 Hatalı İstek: Düz HTTP isteği HTTPS bağlantı noktasına gönderildi” sorununun nasıl çözüleceğini göstereceğiz. Bu hata normalde Nginx'i hem HTTP hem de HTTPS isteklerini işleyecek şekilde yapılandırmaya çalıştığınızda ortaya çıkar.

Bu kılavuzun amacı doğrultusunda, nginx'in sunucu blokları (veya Apache'deki sanal ana bilgisayarlar) aracılığıyla uygulanan birden fazla web sitesine hizmet verdiği, yalnızca bir web sitesinin SSL kullandığı ve geri kalanının kullanmadığı bir senaryoyu düşünüyoruz.

Ayrıca Okuyun: Nginx'in Performansını Güvenceye Almak, Güçlendirmek ve Artırmak için Temel Kılavuz

Ayrıca, nginx'e hem 80 hem de 443 bağlantı noktasını dinlemesini söyleyen aşağıdaki örnek SSL yapılandırmasını da ele alacağız (güvenlik nedeniyle gerçek alan adını değiştirdik). Ve HTTP'deki tüm isteklerin varsayılan olarak HTTPS'ye yönlendirilmesi gerekir.

Nginx Örnek Yapılandırması

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

Yukarıdaki yapılandırmayı kullanarak, bir istemci sitenize 80 bağlantı noktası (yani http://example.com) üzerinden erişmeye çalıştığında, söz konusu hata aşağıdaki gibi görüntülenecektir. ekran görüntüsü.

Bu hatayla karşılaşıyorsunuz çünkü bir istemci sitenize HTTP aracılığıyla erişmeye çalıştığında istek HTTPS'ye yönlendiriliyor. Bunun nedeni, nginx'in işlemde SSL kullanılmasını beklemesine rağmen orijinal isteklerin (80 numaralı bağlantı noktası üzerinden alınan) düz HTTP olması, hatadan şikayetçi olmasıdır.

Öte yandan, bir istemci https://example.com kullanıyorsa yukarıdaki hatayla karşılaşmayacaktır. Ayrıca, SSL kullanmayacak şekilde yapılandırılmış başka web siteleriniz varsa, nginx onlar için varsayılan olarak HTTPS'yi kullanmaya çalışacak ve yukarıdaki hataya neden olacaktır.

Bu hatayı düzeltmek için yapılandırmanızda aşağıdaki satırı yorumlayın veya kapalı olarak ayarlayın.

#ssl on 
OR
ssl off

Dosyayı kaydedip kapatın. Daha sonra nginx hizmetini yeniden başlatın.

systemctl restart nginx
OR
sudo systemctl restart nginx

Bu şekilde, nginx'in birden fazla sunucu bloğu için hem HTTP hem de HTTPS isteklerini işlemesini sağlayabilirsiniz.

Son olarak aşağıda, yaygın Linux dağıtımlarında ve FreeBSD'de SSL HTTPS kurulumuyla ilgili makalelerin bir listesi bulunmaktadır.

  1. RHEL/CentOS'ta Nginx için Let's Encrypt SSL Sertifikası ile HTTPS Kurulumu
  2. Ubuntu ve Debian'da Nginx'i Ücretsiz Let's Encrypt SSL Sertifikasıyla Güvenli Hale Getirin
  3. Nginx'i SSL ile Koruma ve FreeBSD'de Şifreleyelim

Şimdilik bu kadar. Bu hatayı çözmenin başka bir yolunu biliyorsanız lütfen aşağıdaki geri bildirim formunu kullanarak bize bildirin.