kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
farkmt2official 1
farkmt2official
mannaxxx 1
mannaxxx
Bvural41 1
Bvural41
Agora Metin2 1
Agora Metin2
berkmenoo 1
berkmenoo
Hikaye Ekle

[NODE JS] HTTP Redirect Nasıl Yapılır?

nodejs.png


[NODE JS] HTTP Redirect Nasıl Yapılır?​


Merhaba arkadaşlar, bugün Node.js'te HTTP redirect konusunu ele alacağız. Yönlendirme yani redirect, web geliştirmede en sık kullandığımız mekanizmalardan biri. Kullanıcıyı bir URL'den başka bir URL'ye otomatik olarak göndermek istediğimizde redirect kullanıyoruz. Mesela eski bir sayfanın URL'si değiştiğinde, kullanıcı giriş yaptıktan sonra ana sayfaya yönlendirmek istediğimizde ya da HTTP'den HTTPS'e zorunlu geçiş yaptırmak istediğimizde bu mekanizmaya başvuruyoruz.

Ben ilk başladığımda redirect kodlarını karıştırıyordum. 301 mi 302 mi kullanmalıyım diye sürekli Google'a bakıyordum. Şimdi size bu farkı net bir şekilde anlatayım. 301 kalıcı yönlendirme demek. Yani tarayıcıya diyorsunuz ki "bu sayfa artık burada değil, kalıcı olarak şuraya taşındı." Tarayıcı bunu cache'ler ve bir dahaki sefere doğrudan yeni adrese gider. 302 ise geçici yönlendirme. "Şu an için oraya git ama bu adres hala geçerli olabilir" mesajı veriyorsunuz.

Node.js'te redirect yapmak aslında çok basit bir işlem. HTTP response header'larından "Location" header'ını set edip, uygun status code'u döndürmeniz yeterli. Saf Node.js ile yani herhangi bir framework kullanmadan bunu yapabileceğiniz gibi, Express gibi framework'lerle de çok daha kolay bir şekilde halledebilirsiniz.

Saf Node.js'te redirect yaparken writeHead metodunu kullanıyoruz. Bu metod hem status code'u hem de header'ları bir arada set etmemizi sağlıyor. Location header'ına hedef URL'yi yazıyoruz ve response'u sonlandırıyoruz. Dikkat etmeniz gereken önemli bir nokta var: response.end() çağrısını unutmayın. Ben bir keresinde end() çağırmayı unutmuştum ve uygulama sürekli timeout veriyordu. Saatlerce hata aradım, sonunda bu basit hatayı fark ettim.

Redirect yaparken dikkat etmeniz gereken bir diğer konu da sonsuz döngü oluşturmamak. Mesela A sayfası B'ye, B sayfası da A'ya redirect ediyorsa tarayıcı bir süre sonra "too many redirects" hatası verecektir. Bu genellikle koşullu redirect'lerde yapılan bir hata. Yani redirect koşulunu doğru belirlemeniz çok önemli.

Pratikte en çok karşılaştığım kullanım senaryolarından biri HTTP'den HTTPS'e yönlendirme. Güvenlik açısından tüm trafiğin HTTPS üzerinden akması gerekiyor. Bir diğer yaygın senaryo ise login sonrası yönlendirme. Kullanıcı giriş yaptıktan sonra onu dashboard'a veya önceki sayfasına geri yönlendiriyoruz.

Bir de 307 ve 308 status kodlarından bahsedeyim. 307 geçici redirect ama HTTP metodunu korur, 308 ise kalıcı redirect ve yine metodu korur. POST ile gelen bir isteği redirect ettiğinizde 302 kullanırsanız tarayıcı bunu GET'e çevirebilir. Ama 307 kullanırsanız POST olarak kalır. Bu ayrım özellikle API geliştirirken çok önemli.

Express'te redirect yapmak çok daha kolay. res.redirect() metodu tüm işi sizin yerinize halleder. Parametre olarak sadece URL verebileceğiniz gibi, status code ve URL'yi birlikte de verebilirsiniz. Varsayılan olarak 302 kullanır ama siz 301 ya da istediğiniz kodu belirtebilirsiniz. Relative path'ler de desteklenir, mesela res.redirect('/login') gibi.

Bir web uygulaması geliştirirken redirect stratejinizi önceden planlayın. Hangi durumlarda hangi status kodunu kullanacağınızı, hangi sayfaların hangi sayfalara yönlendireceğini bir akış diyagramıyla çizmenizi öneririm. Bu sayede hem sonsuz döngülerin önüne geçersiniz hem de SEO açısından doğru kodları kullanmış olursunuz. Çünkü arama motorları 301 ve 302 arasındaki farkı çok önemser ve yanlış kullanım sıralamalarınızı olumsuz etkileyebilir.

JavaScript:
const http = require('http');

// Basit bir redirect ornegi - 301 Kalici Yonlendirme
const server = http.createServer((req, res) => {{
  if (req.url === '/eski-sayfa') {{
    // 301 kalici yonlendirme
    res.writeHead(301, {{
      'Location': '/yeni-sayfa'
    }});
    res.end();
    return;
  }}

  if (req.url === '/gecici') {{
    // 302 gecici yonlendirme
    res.writeHead(302, {{
      'Location': '/hedef-sayfa'
    }});
    res.end();
    return;
  }}

  // HTTP -> HTTPS yonlendirme ornegi
  if (req.url === '/guvenli') {{
    res.writeHead(301, {{
      'Location': 'https://example.com/guvenli'
    }});
    res.end();
    return;
  }}

  if (req.url === '/yeni-sayfa') {{
    res.writeHead(200, {{ 'Content-Type': 'text/html; charset=utf-8' }});
    res.end('<h1>Yeni sayfaya hosgeldiniz!</h1>');
    return;
  }}

  if (req.url === '/hedef-sayfa') {{
    res.writeHead(200, {{ 'Content-Type': 'text/html; charset=utf-8' }});
    res.end('<h1>Gecici hedef sayfa</h1>');
    return;
  }}

  res.writeHead(200, {{ 'Content-Type': 'text/html; charset=utf-8' }});
  res.end(`
    <h1>Ana Sayfa</h1>
    <ul>
      <li><a href="/eski-sayfa">Eski Sayfa (301 Redirect)</a></li>
      <li><a href="/gecici">Gecici Redirect (302)</a></li>
      <li><a href="/guvenli">HTTPS Redirect (301)</a></li>
    </ul>
  `);
}});

server.listen(3000, () => {{
  console.log('Sunucu 3000 portunda calisiyor');
  console.log('http://localhost:3000 adresini ziyaret edin');
}});

Şimdi bir de birden fazla yönlendirme kuralını yönetmek için daha düzenli bir yapı kuralım. Gerçek projelerde redirect kurallarını bir map veya config dosyasında tutmak çok daha mantıklı olur.

JavaScript:
const http = require('http');

// Redirect kurallari - gercek projede bunu config dosyasinda tutabilirsiniz
const redirectRules = new Map([
  ['/blog/eski-yazi', {{ target: '/blog/yeni-yazi', code: 301 }}],
  ['/hakkinda', {{ target: '/hakkimizda', code: 301 }}],
  ['/kampanya', {{ target: '/indirimler', code: 302 }}],
  ['/api/v1/users', {{ target: '/api/v2/users', code: 308 }}],
  ['/docs', {{ target: 'https://docs.example.com', code: 301 }}],
]);

// Query string'i koruyarak redirect yapan yardimci fonksiyon
function redirectWithQuery(res, target, code, originalUrl) {{
  const url = new URL(originalUrl, 'http://localhost');
  const queryString = url.search;
  const finalTarget = target + queryString;

  res.writeHead(code, {{
    'Location': finalTarget,
    'Cache-Control': code === 301 ? 'max-age=31536000' : 'no-cache',
    'X-Redirect-Reason': 'URL degisikligi'
  }});
  res.end();
}}

const server = http.createServer((req, res) => {{
  const pathname = new URL(req.url, 'http://localhost').pathname;

  // Redirect kurali var mi kontrol et
  if (redirectRules.has(pathname)) {{
    const rule = redirectRules.get(pathname);
    console.log(`Redirect: ${{pathname}} -> ${{rule.target}} (${{rule.code}})`);
    redirectWithQuery(res, rule.target, rule.code, req.url);
    return;
  }}

  // Trailing slash redirect: /hakkimizda/ -> /hakkimizda
  if (pathname !== '/' && pathname.endsWith('/')) {{
    res.writeHead(301, {{
      'Location': pathname.slice(0, -1)
    }});
    res.end();
    return;
  }}

  res.writeHead(200, {{ 'Content-Type': 'text/html; charset=utf-8' }});
  res.end(`<h1>Sayfa: ${{pathname}}</h1>`);
}});

server.listen(3000, () => {{
  console.log('Redirect sunucusu hazir - port 3000');
}});

Redirect konusu basit görünse de detaylarına indiğinizde oldukça derin bir konu. Özellikle SEO odaklı projelerde redirect chain'lerden (zincirleme yönlendirmelerden) kaçınmanız gerekiyor. Yani A'dan B'ye, B'den C'ye şeklinde değil, doğrudan A'dan C'ye yönlendirme yapmalısınız. Her ekstra redirect hem performansı düşürür hem de arama motorlarının sayfanızı değerlendirmesini olumsuz etkiler.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst