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.
- RHEL/CentOS'ta Nginx için Let's Encrypt SSL Sertifikası ile HTTPS Kurulumu
- Ubuntu ve Debian'da Nginx'i Ücretsiz Let's Encrypt SSL Sertifikasıyla Güvenli Hale Getirin
- 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.