Cloudflare Redirect Rules ile 301 ve 302 Yönlendirme Nasıl Yapılır?

Web sitesi yönetiminde yönlendirmeler, hem kullanıcı deneyimi hem de SEO açısından kritik öneme sahiptir. Bir sayfayı taşıdığında, eski URL’yi kaldırdığında ya da HTTP’den HTTPS’e geçiş yaptığında doğru yönlendirme kurallarını uygulamak, ziyaretçilerini kaybetmemek ve arama motoru sıralamalarını korumak için şarttır. Cloudflare’in Redirect Rules özelliği, bu işlemi sunucu tarafında herhangi bir kod değişikliği yapmadan, doğrudan CDN katmanında gerçekleştirmenize olanak tanır. Bu yazıda Cloudflare Redirect Rules’u derinlemesine ele alacağız, 301 ve 302 yönlendirmeler arasındaki farkları pratik senaryolarla açıklayacağız.

Cloudflare Redirect Rules Nedir?

Cloudflare Redirect Rules, daha önce Page Rules olarak bilinen özelliğin modernize edilmiş ve çok daha güçlü hale getirilmiş versiyonudur. Cloudflare dashboard üzerinden tanımlanan bu kurallar, gelen HTTP isteklerini kaynak sunucuya ulaşmadan önce yönlendirmenizi sağlar. Bu sayede sunucu yükünü azaltır, yanıt sürelerini kısaltır ve yönlendirme mantığını merkezi bir noktadan yönetirsiniz.

Redirect Rules iki ana kategoride incelenir:

  • Static Redirects: Sabit URL’den sabit URL’ye yönlendirme, basit ve hızlı
  • Dynamic Redirects: Değişken içeren, regex veya wildcard kullanan, kaynak URL’nin parçalarını hedef URL’ye taşıyan esnek yönlendirmeler

Free plan kullanıcıları statik yönlendirmeler için 20 kural hakkına sahipken, Pro ve üzeri planlarda bu sayı önemli ölçüde artmaktadır. Dynamic Redirects ise Enterprise planında tam kapsamlı olarak kullanılabilir, ancak bazı özellikler Pro plandan itibaren erişilebilirdir.

301 ve 302 Yönlendirme: Temel Farklar

Bu iki yönlendirme türü arasındaki farkı anlamak, SEO ve teknik performans açısından büyük önem taşır.

301 Moved Permanently (Kalıcı Yönlendirme)

  • Arama motorlarına eski URL’nin artık geçersiz olduğunu, yeni URL’nin kullanılması gerektiğini söyler
  • Link juice (bağlantı değeri) büyük ölçüde yeni URL’ye aktarılır
  • Tarayıcılar bu yönlendirmeyi cache’ler, bir dahaki ziyarette direkt yeni URL’ye gider
  • Domain taşıma, kalıcı sayfa değişiklikleri, HTTP’den HTTPS’e geçiş için kullanılır
  • Bir kez uygulandıktan sonra geri almak zordur çünkü tarayıcı cache’e alır

302 Found (Geçici Yönlendirme)

  • Arama motorlarına “bu URL geçici olarak başka bir yerde” mesajı verir
  • Link juice orijinal URL’de kalır
  • Tarayıcılar genellikle cache’lemez, her seferinde yönlendirmeyi kontrol eder
  • A/B testleri, bakım sayfaları, geçici kampanya URL’leri için uygundur
  • Orijinal URL’nin sıralamalarını korumak istediğinde tercih edilir

Hangi durumda hangisini kullanacağını bilmek, SEO felaketlerinden seni korur. Yanlışlıkla 302 kullanılan bir domain taşıma işlemi, aylarca arama motoru trafiğinin bölünmesine neden olabilir.

Cloudflare Dashboard’da Redirect Rules Oluşturma

Cloudflare paneline giriş yapıp ilgili domainini seçtikten sonra sol menüden Rules > Redirect Rules yolunu izlemen gerekiyor.

Arayüz Üzerinden Basit 301 Yönlendirme

Diyelim ki eski-sayfa.html sayfasını yeni-sayfa yoluna kalıcı olarak taşıdın.

  1. Create rule butonuna tıkla
  2. Rule adı ver: Eski Sayfa 301 Yonlendirme
  3. When incoming requests match bölümünde: URI Path equals /eski-sayfa.html
  4. Then bölümünde: Static, URL olarak https://siteadi.com/yeni-sayfa gir
  5. Status code olarak 301 seç
  6. Deploy et

Bu kadar. Sunucuna tek bir istek bile ulaşmadan Cloudflare edge node’ları bu yönlendirmeyi gerçekleştirir.

Wildcard ile Dizin Yönlendirme

Eski blog yapından yeni yapıya geçiş yapıyorsan ve tüm /blog/ altındaki URL’leri /makaleler/ altına taşıman gerekiyorsa:

# Eski yapı: siteadi.com/blog/makale-adi
# Yeni yapı: siteadi.com/makaleler/makale-adi

# Cloudflare Expression Syntax ile:
(http.request.uri.path wildcard "/blog/*")

# Hedef URL (Dynamic Redirect):
concat("https://siteadi.com/makaleler/", wildcard_replace(http.request.uri.path, "/blog/*", "${1}"))

Bu expression Cloudflare Rules Engine’in kendi sözdizimini kullanıyor. Dashboard’da bunu Edit expression seçeneğiyle manuel girebilirsin.

Gerçek Dünya Senaryoları

Senaryo 1: HTTP’den HTTPS’e Zorla Yönlendirme

Her ne kadar Cloudflare’in SSL/TLS > Edge Certificates bölümündeki “Always Use HTTPS” özelliği bu işi yapsa da, Redirect Rules üzerinden de tanımlayabilirsin:

# Expression:
(http.request.uri.scheme eq "http")

# Hedef (Dynamic):
concat("https://", http.host, http.request.uri.path, 
  if(len(http.request.uri.query) > 0, concat("?", http.request.uri.query), ""))

# Status: 301

Ancak bu senaryo için “Always Use HTTPS” özelliğini kullanmak daha temiz ve pratik bir çözümdür. Redirect Rules’u daha karmaşık durumlar için saklamak mantıklıdır.

Senaryo 2: www’dan Non-www’a Yönlendirme (veya Tersi)

SEO açısından www.siteadi.com ile siteadi.com‘un aynı anda erişilebilir olması duplicate content sorununa yol açar. Birini diğerine kalıcı olarak yönlendirmen gerekir.

# www'dan non-www'a 301:
# Expression:
(http.host eq "www.siteadi.com")

# Hedef:
concat("https://siteadi.com", http.request.uri.path,
  if(len(http.request.uri.query) > 0, concat("?", http.request.uri.query), ""))

# Status: 301

Tersi için yani non-www’dan www’a yönlendirmek istersen expression’ı http.host eq "siteadi.com" olarak değiştir ve hedefte www.siteadi.com kullan.

# non-www'dan www'a 301:
(http.host eq "siteadi.com")

# Hedef:
concat("https://www.siteadi.com", http.request.uri.path,
  if(len(http.request.uri.query) > 0, concat("?", http.request.uri.query), ""))

# Status: 301

Senaryo 3: Eski Domain’den Yeni Domain’e Tam Geçiş

Şirket yeniden markalaşma sürecinde eski-marka.com adresinden yeni-marka.com adresine geçiyor olabilirsin. Her iki domain de Cloudflare’de tanımlıysa bu işlem oldukça kolaylaşır.

# eski-marka.com için Redirect Rule:
# Expression (tüm istekleri yakala):
(http.host eq "eski-marka.com") or (http.host eq "www.eski-marka.com")

# Hedef URL:
concat("https://yeni-marka.com", http.request.uri.path,
  if(len(http.request.uri.query) > 0, concat("?", http.request.uri.query), ""))

# Status: 301

Bu kural eski-marka.com/hakkimizda isteğini yeni-marka.com/hakkimizda adresine yönlendirir, URL yapısını koruyarak.

Senaryo 4: Bakım Sayfası İçin Geçici 302 Yönlendirme

Sisteminizde büyük bir güncelleme yapıyorsunuz ve tüm ziyaretçileri geçici olarak bir bakım sayfasına göndermek istiyorsunuz. Bakım sayfası farklı bir subdomain’de çalışıyor olabilir.

# Ana siteyi bakım sayfasına 302 ile yönlendir:
# Expression:
(http.host eq "siteadi.com") and not (http.request.uri.path eq "/bakim")

# Hedef:
"https://bakim.siteadi.com"

# Status: 302

Bakım tamamlandığında bu kuralı devre dışı bırakman veya silmen yeterli. 302 kullandığın için arama motorları orijinal URL’lerin hala geçerli olduğunu bilir ve sıralamalar korunur.

Senaryo 5: URL’den Query String Kaldırma

Belirli kampanya parametrelerini içeren URL’leri temizlenmiş versiyonlara yönlendirmek isteyebilirsin. Örneğin ?utm_source=email gibi parametreli URL’lerin canonical versiyona 301 yönlendirilmesi:

# Query string içeren istekleri temizle:
# Expression:
(http.request.uri.query contains "utm_source")

# Hedef (parametresiz URL):
concat("https://", http.host, http.request.uri.path)

# Status: 301

Dikkat: Bu yaklaşım analytics verilerini etkileyebilir. UTM parametrelerini Cloudflare’de kesmeden önce analytics altyapını kontrol et.

Senaryo 6: Belirli Ülkelerden Gelen Trafiği Yönlendirme

Cloudflare’in geo-targeting özelliğini Redirect Rules ile birleştirerek farklı ülkelerden gelen ziyaretçileri ilgili dil versiyonuna yönlendirebilirsin:

# Almanya'dan gelen ziyaretçileri Almanca siteye yönlendir:
# Expression:
(ip.geoip.country eq "DE") and (http.request.uri.path eq "/")

# Hedef:
"https://de.siteadi.com/"

# Status: 302

Bu senaryo için 302 tercih edilir çünkü kullanıcı tercihine göre değişkenlik gösterebilir ve kullanıcının orijinal URL’ye dönebilmesini istersin.

Cloudflare API ile Redirect Rules Yönetimi

Büyük ölçekli yönetimde veya CI/CD pipeline’larında Cloudflare API kullanmak çok daha verimlidir. Cloudflare’in Ruleset API üzerinden redirect kurallarını programatik olarak yönetebilirsin.

# Zone ID ve API Token değerlerini ayarla:
ZONE_ID="senin_zone_id"
API_TOKEN="senin_api_token"

# Mevcut redirect ruleset'i listele:
curl -X GET 
  "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rulesets/phases/http_request_dynamic_redirect/entrypoint" 
  -H "Authorization: Bearer ${API_TOKEN}" 
  -H "Content-Type: application/json"
# Yeni bir 301 redirect kuralı oluştur:
curl -X PUT 
  "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rulesets/phases/http_request_dynamic_redirect/entrypoint" 
  -H "Authorization: Bearer ${API_TOKEN}" 
  -H "Content-Type: application/json" 
  --data '{
    "rules": [
      {
        "expression": "(http.request.uri.path eq "/eski-sayfa.html")",
        "description": "Eski sayfayi yeni sayfaya yonlendir",
        "action": "redirect",
        "action_parameters": {
          "from_value": {
            "target_url": {
              "value": "https://siteadi.com/yeni-sayfa"
            },
            "status_code": 301,
            "preserve_query_string": true
          }
        }
      }
    ]
  }'
# Birden fazla kural birlikte ekle (toplu yönetim):
curl -X PUT 
  "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rulesets/phases/http_request_dynamic_redirect/entrypoint" 
  -H "Authorization: Bearer ${API_TOKEN}" 
  -H "Content-Type: application/json" 
  --data '{
    "rules": [
      {
        "expression": "(http.host eq "www.siteadi.com")",
        "description": "www to non-www 301",
        "action": "redirect",
        "action_parameters": {
          "from_value": {
            "target_url": {
              "expression": "concat("https://siteadi.com", http.request.uri.path)"
            },
            "status_code": 301,
            "preserve_query_string": true
          }
        }
      },
      {
        "expression": "(http.request.uri.path eq "/eski-urun")",
        "description": "Eski urun sayfasi yonlendirme",
        "action": "redirect",
        "action_parameters": {
          "from_value": {
            "target_url": {
              "value": "https://siteadi.com/urunler/yeni-urun"
            },
            "status_code": 301,
            "preserve_query_string": false
          }
        }
      }
    ]
  }'

API ile çalışırken dikkat edilmesi gereken önemli bir nokta: PUT isteği mevcut tüm kuralların yerine geçer. Yani mevcut kuralları korumak istiyorsan önce GET ile mevcut durumu çekmen, yeni kuralı ekleyip PUT ile gönderilmesi gerekir.

Terraform ile Redirect Rules Yönetimi

Infrastructure as Code yaklaşımını benimsediysen, Cloudflare Terraform provider’ı ile redirect kurallarını kod olarak yönetebilirsin.

# main.tf - Cloudflare Redirect Rules Terraform konfigurasyonu

resource "cloudflare_ruleset" "redirect_rules" {
  zone_id     = var.zone_id
  name        = "Redirect Rules"
  description = "Site geneli yonlendirme kurallari"
  kind        = "zone"
  phase       = "http_request_dynamic_redirect"

  rules {
    action      = "redirect"
    description = "www non-www yonlendirme"
    expression  = "(http.host eq "www.siteadi.com")"
    enabled     = true

    action_parameters {
      from_value {
        status_code = 301
        target_url {
          expression = "concat("https://siteadi.com", http.request.uri.path)"
        }
        preserve_query_string = true
      }
    }
  }

  rules {
    action      = "redirect"
    description = "Eski blog yapisini yeni yapiya yonlendir"
    expression  = "(http.request.uri.path wildcard "/blog/*")"
    enabled     = true

    action_parameters {
      from_value {
        status_code = 301
        target_url {
          expression = "concat("https://siteadi.com/makaleler/", wildcard_replace(http.request.uri.path, "/blog/*", "${1}"))"
        }
        preserve_query_string = false
      }
    }
  }
}

Kural Öncelikleri ve Sıralama

Birden fazla redirect kuralı tanımladığında Cloudflare kuralları yukarıdan aşağıya sırayla değerlendirir ve ilk eşleşen kuralı uygular. Bu davranışı anlamak çok önemlidir.

  • Daha spesifik kurallar her zaman daha genel kuralların üzerinde olmalı
  • /blog/ozel-makale için özel bir kural varsa /blog/* wildcard kuralından önce gelmelidir
  • Dashboard’da sürükle bırak ile kural sırasını değiştirebilirsin
  • API’de kuralların dizideki sırası öncelik sırasını belirler

Örnek sorunlu durum:

# YANLIS SIRALAMA - Wildcard kural once gelirse:
Kural 1: /blog/* -> /makaleler/* (301)
Kural 2: /blog/ozel-makale -> /kampanya (302)

# Kural 2 hic calismaz cunku Kural 1 her seyi yakalar!

# DOGRU SIRALAMA:
Kural 1: /blog/ozel-makale -> /kampanya (302)
Kural 2: /blog/* -> /makaleler/* (301)

Redirect Rules Test ve Debug

Yönlendirme kurallarını production’a almadan önce ve sonra test etmek kritik öneme sahiptir.

# curl ile yonlendirme zincirini test et:
curl -I -L "https://siteadi.com/eski-sayfa.html"

# Sadece ilk yonlendirmeyi gormek icin:
curl -I "https://siteadi.com/eski-sayfa.html"

# Verbose mod ile detayli bilgi:
curl -v "https://siteadi.com/eski-sayfa.html" 2>&1 | grep -E "< HTTP|Location:"
# Yonlendirme zincirini gormek icin:
curl -sILo /dev/null -w "%{url_effective}n%{http_code}n%{redirect_url}n" 
  "https://siteadi.com/eski-sayfa.html"

# Coklu URL'leri toplu test:
while IFS= read -r url; do
  status=$(curl -o /dev/null -s -w "%{http_code}" -L "$url")
  location=$(curl -o /dev/null -s -w "%{redirect_url}" "$url")
  echo "URL: $url | Status: $status | Redirect: $location"
done < url_listesi.txt

Cloudflare dashboard’unda Observability > Logs bölümünden (log push aktifse) yönlendirme trafiğini inceleyebilirsin. Ayrıca Speed > Optimization altındaki test araçları da işe yarar.

Sık Yapılan Hatalar

Cache sorunu yaşamak: 301 yönlendirmeleri tarayıcı tarafından cache’lenir. Hatalı bir 301 uyguladıktan sonra tarayıcı cache’ini temizlemek zorunda kalabilirsin. Bu yüzden yeni kurularda önce 302 ile test et, doğrulandıktan sonra 301’e çevir.

Redirect döngüsü oluşturmak: siteadi.com -> www.siteadi.com -> siteadi.com şeklinde sonsuz döngüler kolayca oluşabilir. Expression’larını dikkatlice yaz ve http.host kontrolünü unutma.

HTTPS yönlendirmesini iki kez tanımlamak: Hem “Always Use HTTPS” aktif hem de Redirect Rule tanımladıysan, her iki katmanda da yönlendirme çalışır. Bu genellikle sorun çıkarmaz ama gereksiz karmaşıklık yaratır.

Query string’i korumayı unutmak: preserve_query_string parametresini false bırakırsan, örneğin bir ürün sayfasının filtre parametreleri kaybolur ve kullanıcı deneyimi bozulur.

Sonuç

Cloudflare Redirect Rules, sunucu yapılandırmasına dokunmadan güçlü ve esnek yönlendirme kuralları oluşturmana olanak tanıyan, CDN katmanında çalışan etkileyici bir araçtır. HTTP’den HTTPS’e geçiş, domain taşıma, URL yapısı değişikliği gibi klasik senaryoların yanı sıra geo-targeting, bakım sayfası yönlendirmeleri ve A/B testleri gibi daha sofistike kullanım senaryolarında da son derece işlevseldir.

301 ve 302 arasındaki tercih, teknik bir detay gibi görünse de SEO stratejinin belkemiğini oluşturur. Kalıcı değişiklikler için 301, geçici durumlar için 302 kullanmak bu basit ama hayati kuralı her zaman aklında tut.

API ve Terraform entegrasyonuyla bu kuralları Infrastructure as Code pratiğine dahil etmek, özellikle birden fazla domain yönetiyorsan büyük kolaylık sağlar. Kural önceliklerini doğru ayarlamak ve curl ile düzenli test yapmak da olası surprizlerin önüne geçer.

Son olarak şunu söyleyeyim: Redirect Rules, Page Rules’un sınırlamalarından kurtulmak isteyenler için gerçek bir özgürleşme hissi verir. Daha okunabilir expression syntax’ı, daha fazla esneklik ve daha iyi performans sunar. Hala Page Rules kullanıyorsan, Cloudflare da bu geçişi aktif olarak teşvik ediyor ve yakın gelecekte Page Rules’u emekliye ayırmayı planlıyor. Geçişi erken yapman, sürpriz bir migration stresinden seni kurtarır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir