İçeriğe geç
Approvalens

Okuma odası · 8 dk okuma

Yönlendirme Zinciri ve Döngüsü: Her Adımı Bul, Teke İndir

Yönlendirme zinciri ve döngüsü AdSense incelemesini neden bozar, adımlar curl ile nasıl izlenir; Apache, Nginx, Cloudflare ve Next.js için tek kural.

Approvalens ekibi

Şu rapor bulgularını düzeltir

  • Yönlendirme zinciri
  • Yönlendirme zincirleri
  • Yönlenen site içi bağlantılar
  • Geçici yönlendirmeler
  • Meta refresh yönlendirmeleri
  • HTTP'den HTTPS'ye yönlendirme
  • www'li ve www'siz adres
  • Sonu eğik çizgili ve çizgisiz aynı sayfa

Yönlendirme zinciri, bir adresin seni ikinciye, ikincinin üçüncüye göndermesi ve sayfanın ancak sonunda açılması demek. Döngü ise hiç bitmeyen zincir: tarayıcı bir süre sonra "çok fazla yönlendirme" deyip pes ediyor. İkisinin de kaynağı genelde aynı: CDN, sunucu, WordPress ya da bir eklenti, https, www ve sondaki eğik çizgi konusunda her biri kendi kuralını uyguluyor. Çözüm, her işi tek bir katmana vermek ve her eski adresi tek bir 301 ile son adrese ulaştırmak.

Normal yönlendirme nerede biter, zincir nerede başlar?

Tek yönlendirme sorun değil; yönlendirme zaten bunun için var. Google'ın tavsiyesi de net: mümkün olduğunda sunucu tarafında kalıcı yönlendirme kullan. Belgedeki cümle aynen şöyle: "We recommend that you use a permanent server-side redirect whenever possible" (Google: yönlendirmeler).

Durum kodu, Google'a taşımayı nasıl yorumlayacağını söylüyor:

Kod Tür Google ne yapar
301, 308 Kalıcı İzler ve hedefin asıl (canonical) adres olması gerektiğine dair sinyal olarak kullanır
302, 303, 307 Geçici İzler ama hedefi asıl adres saymak için sinyal olarak kullanmaz
Anında meta refresh Kalıcı Google bunu kalıcı yönlendirme olarak yorumlar
Gecikmeli meta refresh Geçici Geçici yönlendirme olarak yorumlanır
JavaScript Son çare Google yalnızca sunucu tarafı ya da meta refresh mümkün değilse kullanmanı öneriyor

Asıl maliyet zincirde başlıyor. Google'ın botları belli bir derinlikte duruyor: "By default, Google's crawlers follow up to 10 redirect hops. However, specific products' crawlers may have different limits" (HTTP durum kodları). Tarama belgesi daha da açık: "Avoid long redirect chains, which have a negative effect on crawling" (tarama bütçesi). Döngü ise hiçbir sayfaya varmıyor; Search Console bunu Sayfa dizine ekleme raporunda "Redirect error" altında, çok uzun zincirle birlikte listeliyor (rapor açıklaması).

AdSense açısından neden önemli?

AdSense'in site hazırlık listesinde yönlendirmeyle ilgili iki soru var. Sertifika için: "does it also redirect HTTP to HTTPS?" Ve: "Did you provide the correct URL?" (AdSense yardım). Üç farklı adres arasında zıplayan bir ana sayfa, hangisinin asıl site olduğunu bulanıklaştırıyor; döngü ise dışarıdan bakınca kapalı bir siteden farksız. Yukarıdaki "farklı sınırlar" cümlesini de unutma: AdSense botunun Googlebot kadar sabırlı olduğunu varsayma.

ads.txt'nin kendi kuralları var. AdSense'e göre www.alanadi.com/ads.txt dosyası, ancak alanadi.com/ads.txt oraya yönlendiriyorsa taranıyor; site yalnızca HTTPS ise http://alanadi.com/ads.txt adresi de HTTPS sürümüne yönlenmeli (ads.txt rehberi). Kök alan adındaki istek döngüye girerse dosya orada olsa bile "bulunamadı" görünür. Dosyanın kendisi için ads.txt kurulumu rehberine bak.

Approvalens neye bakıyor?

Kontrollerin hepsi gerçekten çektiğimiz adreslere dayanıyor: taranan sayfalar ve ayrıca test edilen en fazla 120 site içi link. Arşivin derinlerinde kalan bir link gözden kaçabilir. Taramanın nasıl çalıştığı metodoloji sayfasında.

Bulgu Neyi çekiyoruz Ne zaman çıkar
access.redirect_chain https://alanadin/ (yazdığın adres https ve / olarak normalleştirilir), en fazla 8 yönlendirme izlenir Ana sayfa açılmadan 3 ya da daha fazla adım. Döngü ya da 8'den fazla adım, ana sayfayı erişilemez yapar
access.http_redirect http://alanadin/, yönlendirme izlenmeden https'ye 302/307 ise bilgi notu, https'ye hiç yönlenmiyorsa uyarı
access.alt_host Diğer alan adı biçimi (www ↔ www'siz) Çözümlenmiyorsa ya da ayrı bir kopya sunuyorsa uyarı; kopya sunup ana adrese canonical veriyorsa not
seo.internal_redirects Taranan sayfalardaki site içi linkler 3 ya da daha fazla link bir yönlendirmeden geçiyor
seo.redirect_chains Aynı linkler 2 ya da daha fazla adım süren her link
seo.temporary_redirects Aynı linkler İlk adım 302, 303 ya da 307
seo.meta_refresh Taranan sayfalar HTML'de <meta http-equiv="refresh"> var, gecikme kaç saniye olursa olsun
seo.trailing_slash İki yazı, sondaki / tersine çevrilerek Diğer biçim yönlendirmeden ve geri işaret eden canonical olmadan 200 dönüyor

İşaretlenen her yönlendirme hata değil. Taradığımız bir sitede tek zincir, tek geçici yönlendirme ve tek meta refresh aynı linkten çıktı: "Google ile giriş yap" butonu. Google'ın giriş sayfasına 302 yapıyor, o sayfa da kendi meta refresh'ini kullanıyor. Giriş butonu için bu normal, düzeltilecek bir şey yok. Aynı sitedeki diğer site içi yönlendirmeler ise düzeltmeye değerdi; biri adresi değişmiş bir sayfayı hâlâ eski yoluyla gösteriyordu.

Adımları kendin izle

curl her adımı durum kodu ve Location başlığıyla gösterir:

$ curl -sIL http://www.ornekblog.com/rehber | grep -iE '^(HTTP|location)'
HTTP/1.1 301 Moved Permanently
Location: https://www.ornekblog.com/rehber
HTTP/2 301
location: https://ornekblog.com/rehber
HTTP/2 301
location: https://ornekblog.com/rehber/
HTTP/2 200

Üç adım, her biri ayrı bir kuraldan. Okumadan saymak için:

$ curl -sL -o /dev/null -w '%{num_redirects} adım -> %{url_effective}\n' http://www.ornekblog.com/rehber
3 adım -> https://ornekblog.com/rehber/

Döngüde aynı location curl duruncaya kadar tekrar eder:

$ curl -sSIL https://ornekblog.com/ | grep -iE '^(HTTP|location|server)'
HTTP/2 301
location: https://ornekblog.com/
server: cloudflare
HTTP/2 301
location: https://ornekblog.com/
server: cloudflare
...
curl: (47) Maximum (10) redirects followed

Chrome'da DevTools'u aç, Network panelinde Preserve log kutusunu işaretle (yoksa her yönlendirme listeyi siler) ve eski adresi yükle; her adım ayrı bir satır olarak görünür. Gizli pencere kullan: tarayıcılar 301'i önbelleğe alır, düzelttiğin kural normal profilde hâlâ bozuk görünebilir.

Ücretsiz Googlebot erişim kontrolü aracımız ana sayfanı tarayıcı, telefon ve üç Google kullanıcı aracısı olarak çeker ve her biri için son adresi gösterir. Biri farklı bir yere varıyorsa bir şey kullanıcı aracısına göre yönlendiriyor demektir. ads.txt kontrolü de /ads.txt üzerindeki yönlendirmeleri izleyip dosyanın gerçekte nerede bulunduğunu gösterir.

İki sütun: solda eski bir http://www linki üç ayrı 301'den geçiyor (HTTPS'e zorla, www'yi at, sona / ekle); sağda tek kural onu tek adımda son adrese götürüyor
Tek işe odaklı üç kural üç adım üretir; protokolü, alan adını ve eğik çizgiyi birlikte yazan tek kural tek adım üretir.

Döngü ve zincir nereden çıkar?

Bir isteği yönlendirebilecek dört katman: CDN, web sunucusu, CMS ya da framework ve HTML'in kendisi; her birinin hangi iş için uygun olduğu
İki katman aynı anda https ya da www dayatırsa ya anlaşıp zincir kurar ya da anlaşamayıp döngüye girer.
Belirti Olası neden Çözüm
Döngü yalnızca Cloudflare arkasında SSL/TLS modu Flexible, sunucu da HTTPS'e zorluyor Sunucuya sertifika kurup Full (strict) seç ya da sunucudaki HTTPS kuralını kaldır
Always Use HTTPS açınca döngü Sunucu HTTPS'i HTTP'ye geri yönlendiriyor Sunucudaki HTTP yönlendirmesini kaldır
Taşımadan sonra WordPress döngüsü "WordPress Address (URL)" ve "Site Address (URL)", hostingin www/https kuralıyla çelişiyor İkisini de son adresle aynı yap
Her eski linkte iki üç adım https, www ve eğik çizgi için ayrı kurallar Tek kuralda birleştir
301 beklerken 302 Eklentinin varsayılanı ya da kodsuz Apache R bayrağı 301'i açıkça yaz

İlk durumu Cloudflare kendisi anlatıyor: Flexible modda "Redirect loops will occur if your origin server automatically redirects all HTTP requests to HTTPS", çünkü Cloudflare sunucuna düz HTTP ile bağlanıyor (Cloudflare: ERR_TOO_MANY_REDIRECTS). Şifreleme modu SSL/TLS genel bakış sayfasında, Always Use HTTPS ise SSL/TLS → Edge Certificates altında. Aynı panelin bot engelleme tarafı için Cloudflare ve AdSense engeli rehberine bak.

Ziyaretçi Cloudflare'e HTTPS ile, Cloudflare sunucuya düz HTTP ile bağlanıyor; sunucu https'ye 301 veriyor ve döngü ERR_TOO_MANY_REDIRECTS hatasına kadar sürüyor
Flexible modda sunucu HTTPS'i hiç görmez; kendi HTTPS yönlendirmesi her istekte yeniden çalışır.

WordPress'te iki adres alanı da Ayarlar → Genel'de. WordPress ziyaretçiyi "Site Address (URL)" alanındaki alan adına gönderir; orada www yazıyorsa ve sunucu www'yi siliyorsa istek ikisi arasında gidip gelir. Döngü yüzünden panele giremiyorsan WordPress belgeleri wp-config.php içine WP_HOME ve WP_SITEURL tanımlamayı gösteriyor; bunun değerleri siteye sabit yazmak olduğunu ve en iyi çözüm olmayabileceğini de not ediyor (WordPress taşıma).

Tek adımlık tarifler

Önce asıl biçimi seç; burada https://ornekblog.com, www'siz. Sonra kuralı yalnızca bir katmana koy.

Apache (.htaccess), # BEGIN WordPress bloğunun üstüne:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://ornekblog.com%{REQUEST_URI} [R=301,L,NE]

%{HTTPS} bağlantı TLS ise "on" değerini alır (mod_rewrite). Böylece düz HTTP ya da www ile gelen her istek, yol ve sorgu dizesi korunarak doğrudan son adrese gider. Cloudflare Flexible arkasında sunucu %{HTTPS} değerini hep "off" görür ve bu kural döngüye girer; önce SSL modunu düzelt. Sunucu ayarlarına erişimin varsa Apache ayrı bir sanal sunucuda Redirect kullanmayı öneriyor (canonical alan adları).

Nginx, her biçim için ayrı server bloğu, hepsi son adresle cevap veriyor:

# düz HTTP, iki ad da
server {
    listen 80;
    server_name ornekblog.com www.ornekblog.com;
    return 301 https://ornekblog.com$request_uri;
}
# www üzerinde HTTPS
server {
    listen 443 ssl;
    server_name www.ornekblog.com;
    ssl_certificate     /etc/ssl/ornekblog.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/ornekblog.com/privkey.pem;
    return 301 https://ornekblog.com$request_uri;
}
# asıl site: server_name ornekblog.com; burada yönlendirme kuralı yok

return 301 URL, Nginx belgelerindeki yönlendirme yöntemi (ngx_http_rewrite_module). Sertifika www'yi de kapsamalı; yoksa www isteği yönlendirilemeden hata verir.

cPanel: Domains sayfasında geçerli sertifika isteyen bir Force HTTPS Redirect anahtarı var (cPanel Domains). Redirects sayfası "Permanent (301)" ya da "Temporary (302)" seçeneği sunuyor; cPanel bu kuralları .htaccess dosyasının en altına yazdığını ve bazı uygulamaların onları yok saydığını belirtiyor (cPanel Redirects). Birini seç; üstüne bir de elle kural ekleme.

Next.js: varsayılan olarak "Next.js will redirect URLs with trailing slashes to their counterpart without a trailing slash"; trailingSlash: true bunu tersine çevirir. İkisi de kalıcı 308 kullanır. redirects() içinde permanent: true 308, false 307 verir; taşınan her sayfada bu bayrağa bak:

// next.config.js
module.exports = {
  async redirects() {
    return [
      {
        source: '/:path*',
        has: [{ type: 'host', value: 'www.ornekblog.com' }],
        destination: 'https://ornekblog.com/:path*',
        permanent: true,
      },
      { source: '/blog/eski-adres', destination: '/blog/yeni-adres/', permanent: true },
    ]
  },
}

Hedefleri son hâliyle yaz (trailingSlash açıksa eğik çizgiyle); yoksa eğik çizgi yönlendirmesi ikinci bir adım ekler.

Hâlâ yönlenen linkleri temizle

Eski adresler tek adımda son adrese ulaşıyorsa sıra, okuru hiç yönlendirmeye sokmamakta:

  • Site içi linkler. Menüyü, bileşenleri ve yazı içi linkleri son adrese çevir. http→https ya da alan adı değişikliğinden sonra bir ara-değiştir eklentisi bunu toplu yapar; önce veritabanını yedekle.
  • Geçici kodlar. Kalıcı taşımalarda 301/308 kullan. 302'yi gerçekten geçici olan giriş ya da dil yönlendirmelerine bırak.
  • Meta refresh. <meta http-equiv="refresh" content="0; url=/yeni/"> yerine sunucu tarafında 301 kullan. Kendini belli aralıklarla yenileyen sayfa ayrı bir sorun; o etiketi kaldır.
  • Sondaki eğik çizgi. /rehber ve /rehber/ ikisi de 200 dönüyorsa birini diğerine yönlendir, canonical'ı kalana ver. Ayrıntılar canonical etiketi sorunları ve kopya içerik ve AdSense rehberlerinde.
  • Ölü sayfalara giden linkler. Silinen bir yazıyı yalnızca yakın bir karşılığına yönlendir; her şeyi ana sayfaya yollamak soft 404 üretir. Bkz. kırık linkler ve soft 404.

Sorun AdSense'te "site kapalı" reddi olarak çıktıysa site kapalı veya kullanılamıyor rehberi DNS, SSL ve güvenlik duvarı kontrollerini de anlatıyor.

Ana sayfanın yönlendirme yolunu ve birden fazla adım süren her site içi linki görmek için ücretsiz tarama yap.

Sık sorulan sorular

Kaç yönlendirme fazla sayılır?

Google'ın botları varsayılan olarak 10 adıma kadar izliyor ama diğer Google ürünleri daha erken durabilir. Kendi linklerinde sıfır, eski ya da alternatif adreslerde tek adım hedefle. Approvalens ana sayfada üç, site içi linkte iki adımda uyarır.

308, 301 kadar iyi mi?

Google için evet: ikisi de kalıcı ve ikisi de hedefin asıl adres olduğunu söyler. Next.js kalıcı yönlendirmede varsayılan olarak 308 kullanır, bunda sorun yok.

Döngü neden yalnızca bazı tarayıcılarda çıkıyor?

Genelde o tarayıcıda eski kurulumdan kalan, önbelleğe alınmış bir 301 ya da HSTS kaydı vardır. curl ya da gizli pencereyle dene. curl da döngüye giriyorsa sorun sunucuda ya da CDN'de.

ads.txt www'siz adresten www'ye yönlenmeli mi?

Yalnızca site www üzerindeyse. AdSense alanadi.com/ads.txt adresini tarar ve www.alanadi.com/ads.txt adresine giden yönlendirmeyi izler; bu yönlendirme yoksa yalnızca www'de duran dosyayı bulamaz.

Eskimiş ya da yanlış bir şey mi gördün? Bize yaz, düzeltelim.

Bu rehberi İngilizce oku →

Kendi sitende kontrol et. Ücretsiz, kayıt yok.

Bunun için ücretsiz araçlar

Ücretsiz tarama

Kendi siteni kontrol et

Ücretsiz tarama: uygunluk puanı ve tüm sorunlar, genelde birkaç dakikada.

Ücretsiz tarama · puan ve bulunan tüm sorunlar · üyelik yok

Tüm rehberler →