Nginx'te http'den https'ye ve www yönlendirmesi (301) nasıl yapılır?

Nginx ve Web Sunucusu 64 görüntülenme Markdown

Sitenizin aynı sayfaya dört farklı adresten açılması hem ziyaretçiyi hem arama motorlarını şaşırtır: http://ornek.com, http://www.ornek.com, https://ornek.com, https://www.ornek.com. Doğru kurulumda bunların hepsi tek bir "asıl" adrese 301 (kalıcı yönlendirme) ile gider. Nginx'te bu iş birkaç satırla yapılır ve .htaccess gerektirmez.

Önce karar: hangisi asıl adres?

İkisinden birini seçin ve hep onu kullanın. Hangisi olduğu önemli değildir, tutarlılık önemlidir. Aşağıda asıl adres https://ornek.com (www'siz) kabul edilmiştir. www'li istiyorsanız kurallarda adları ters çevirin.

Kural 1: http her şey https'e

Bu blok 80 numaralı porttaki tüm istekleri asıl adrese yönlendirir:

server {
    listen 80;
    server_name ornek.com www.ornek.com;
    return 301 https://ornek.com$request_uri;
}

$request_uri yolu ve sorgu dizesini korur: /urun?id=5 adresi yönlendirmeden sonra da aynı kalır.

Kural 2: https'te www'yu www'siz yapma

443 numaralı portta, www'li adrese gelenleri www'siz adrese gönderin (sertifikanın www'yi de kapsaması gerekir):

server {
    listen 443 ssl;
    server_name www.ornek.com;
    ssl_certificate     /etc/letsencrypt/live/ornek.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ornek.com/privkey.pem;
    return 301 https://ornek.com$request_uri;
}

Asıl site bloğu ise yalnızca server_name ornek.com; ile 443'te dinler. Sertifika dosya yolları Certbot'un oluşturduğu yollardır; kendi alan adınıza göre kontrol edin: sudo certbot certificates.

Certbot ile otomatik yönlendirme

sudo certbot --nginx -d ornek.com -d www.ornek.com komutu sertifikayı alır ve http'den https'ye yönlendirmeyi sizin için ayara ekleme seçeneği sunar. Bu yönlendirme www'yu www'siz yapmaz; onu yukarıdaki kural 2 gibi elle yazmanız gerekir.

Sınayın

sudo nginx -t && sudo systemctl reload nginx
curl -sI http://www.ornek.com/ornek?a=1 | grep -i -E "^(HTTP|location)"
curl -sI https://www.ornek.com/ | grep -i -E "^(HTTP|location)"

Her iki komut da 301 ve location: https://ornek.com/... göstermeli. Yönlendirmenin sayfa yolunu koruduğundan emin olun.

Döngü olursa (ERR_TOO_MANY_REDIRECTS)

  • Yönlendirme hem Nginx'te hem WordPress ayarlarında ya da bir eklentide yapılıyor olabilir. Yalnızca birini kullanın.
  • Cloudflare "Flexible" SSL modundaysa sunucuya http ile bağlanır ve sunucu tekrar https'ye gönderir. Modu Full (strict) yapın: https geçişi ve yönlendirme döngüsü.
  • Arkada uygulama sunucusu varsa isteğin https olduğunu uygulamaya X-Forwarded-Proto başlığıyla bildirin: Nginx ters proxy.

Hosting paketinde bu kuralları yazmanıza gerek yoktur; panelde alan adı ayarlarındaki Otomatik HTTPS yeniden yönlendirmesini etkinleştir ve alan adı yönlendirmesi seçenekleri aynı işi yapar: .htaccess çalışmıyor.

Sık sorulanlar

302 yerine neden 301 kullanıyoruz?

301 kalıcı, 302 geçici yönlendirmedir. Arama motorları 301'i görünce eski adresi bırakıp yeni adresi indeksler. Adres kalıcı olarak değiştiyse 301 kullanın.

Hem www hem www'siz çalışsın istiyorum.

Çalışabilir ama aynı içeriğin iki adreste yayınlanması arama motorlarında kopya içerik sorunu yaratır. İkisini birden sunmak yerine biri diğerine yönlendirsin.

Yönlendirme sonrası form gönderimi bozuldu.

301 yönlendirmesi POST isteklerini GET'e çevirebilir. Formunuzu doğrudan asıl https adresine gönderin.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.