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

https://kervanhosting.com/bilgi-bankasi/makale/nginx-http-https-ve-www-yonlendirme-ayarlari

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ü](https://kervanhosting.com/bilgi-bankasi/makale/wordpress-https-gecisi-url-degistirme-ve-yonlendirme-dongusu).
- Arkada uygulama sunucusu varsa isteğin https olduğunu uygulamaya `X-Forwarded-Proto` başlığıyla bildirin: [Nginx ters proxy](https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama).

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](https://kervanhosting.com/bilgi-bankasi/makale/hosting-de-htaccess-calismiyor-nginx-ve-alternatifleri).

## 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**

- [Nginx ile tek sunucuda birden fazla web sitesi (server block)](https://kervanhosting.com/bilgi-bankasi/makale/nginx-ile-birden-fazla-web-sitesi-server-block-sanal-host)
- [WordPress'i https'e geçirme, adres değiştirme ve yönlendirme döngüsü (ERR_TOO_MANY_REDIRECTS)](https://kervanhosting.com/bilgi-bankasi/makale/wordpress-https-gecisi-url-degistirme-ve-yonlendirme-dongusu)
- [Siteme ücretsiz SSL (https) nasıl eklerim?](https://kervanhosting.com/bilgi-bankasi/makale/siteme-ucretsiz-ssl-https-nasil-eklerim)

*Sorununuz çözülmediyse [destek talebi açın](https://kervanhosting.com/destek-taleplerim). Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.*
