“UrlRewriting” Nedir ?

Kullanıcıya gösterilecek malumat yada bilgiler genellikle sitelerin URL’lerinde değişken olarak bulunur. Bu bir nevi koda, varsayalım bir eticaret sitesinde urunId’si 8 olan ürüne ait detaylarını getirmesini söylemek gibi bir şeydir.

Aşağıdaki linke bu kullanıma ait örneği görebilirsiniz :

http://www.eticaret.com/urunler.aspx?urunId=7

Buradaki problem bir önceki URL hatırlanmayacak. Mobil cihazlarda bu URL’yi okumak oldukça zorlaşacak, ek olarak arama motorları( örneğin Google gibi ) URL’den içerik hakkında bir bilgi alamayacaktır. urunId’si 8 olan ürünümüz diyelim ki “Vestel” marka bir televizyonu temsil ediyor. İşte bizim yapmak istediğimiz şeyde urunId=8 yerine “Vestel” yazdırmak.

Önceki URL’den istediğimiz kolay okunması ve anlaşılabilir olmasıydı. Şayet aşağıdaki gibi bir URL meydana getirebilirsek bunu başarmış olacağız.

http://www.eticaret.com/televizyon/Vestel

URL’ye baktığımızda “Vestel” markalı bir televizyon ile ilgili bir görüntüleme yapıldığı ve televizyonlar kategorisiyle ilişkili olduğu kolayca anlaşılabiliyor. Gelelim bu işlemi nasıl gerçekleştireceğimize…

ASP.NET URL rewrite nasıl yapılır ?

ASP.NET  Rewrite URL işlemini gerçekleştirmek için HTTP Modüllerini kullanacağız. HTTP modüller HTTP handler gerçekleşmeden önce veya gerçekleştikten sonra çağrılır. HTTP modüller bir özel isteği düzenlemede ve durdurmada bize yardımcı olurlar. HTTP modüller System.Web namespace içerisinde yer alan IHttpModule arayüz (interface) uygulamalarıdır. Modüller yetkilendirme ve kimlik doğrulama kolları olan ASP.NET uygulamalarıdır. Şayet uygulamada URL şifreleme veya özel bir değişiklik yapmak istiyorsanız HTTP modüller yardımıyla istediğinizi uygulayabilirsiniz.

Konuya giriş yapalım ve App_Code klasöründe “URLRewriter.cs” isimli bir class yaratıp aşağıdaki kodları yazalım :

  1. Bir web sitesi uygulaması açın ve “URLRewrite_Test” adını verip “URLRewriter.cs” sınıfını ekleyin.
  2. Visual Studio size “App_Code” içerisinde bir sınıf yaratmak isteyip istemediğini sorarsa “Tamam” deyip devam edin.Solution yapısı aşağıdaki gibi görünecek :UrlReWriteSolution
  3. “URLRewriter.cs” class dosyamızı açıp aşağıdaki gibi HTTP Modül kodlarımızı yerleştirelim.

Esasen sınıfınız metodlarını uygulamak için IHttpModule arayüzünü kullanmak zorundadır. Arayüzü uyguladıktan sonra bu iki metodun oluşturulduğu görebilirsiniz.

  • Dispose
  • Init

Init metodu HttpApplication’ı parametre olarak alır. Bundan dolayı isteği handle etmek ve HttpApplication’nın ilk isteğini handle etmek için bir event handler oluşturmak zorundayız.

Modülümüzün kodları :

using System;
using System.Web;
public class URLRewriter : IHttpModule
{

#region IHttpModule Members

public void Dispose()
{
//örneğimizde bu metodu kullanmayacağız
}

/// <summary>
/// http application örneğinin başlangıcı
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
/// <summary>
/// Event handler örneği istekte bulunur
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void context_BeginRequest(object sender, EventArgs e)
{
//Event'e gidecek uygulamanın bir örneğini oluştur
HttpApplication httpApplication = sender as HttpApplication;

//httpApplication için güvenlik kontrolü - null değilse
if (httpApplication != null)
{
//request path'i (url yolu) al

string requestPath = httpApplication.Context.Request.Path;

//çevirilecek yol değişkeni
string translationPath = "";

//request path şayet /urlrewritetestingapp/televizyon/Vestel/ ise
//site Vesteli görüntülüyor
//else if "/urlrewritetestingapp/laptops/hp/" ise
//site hp'yi görüntülüyor
//else ise varsayılan yol alınır
switch (requestPath.ToLower())
{
case "/URLRewrite_Test/televizyon/Vestel/":
translationPath = "/URLRewrite_Test/Urunler.aspx?urunId=7";
break;
case "/URLRewrite_Test/laptops/hp/":
translationPath = "/URLRewrite_Test/Urunler.aspx?urunId=8";
break;
default:
translationPath = "/URLRewrite_Test/Default.aspx";
break;
}

// Güncel veya son çevrilmiş yolu transfer etmek için server transfer kullan
httpApplication.Context.Server.Transfer(translationPath);
}
}

#endregion
}

4.Şimdi bir default.aspx sayfası oluşturup içine aşağıdaki HTML kodları yerleştirelim.

Bu kod Vestel ve hp markalarını gösterecek


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Defaul" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Laptop Brands</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="http://localhost:51012/URLRewriteTestingApp/Televizyon/Vestel/">Vestel
</a>
<br/>
<a href="http://localhost:51012/URLRewriteTestingApp/laptops/HP/">HP</a>
</div>
</form>
</body>
</html>

5. Referanslı HTML kod içerisine yerleştirdiğimizden code behind tarafından başka birşey yapmaya gerek yoktur. Şimdi bir adet “Urunler” adında bir web form ekleyelim. Bu sayfa default sayfamızda hyperlinke tıklandığında güncel veriyi gösterecek. Uygulamamızı olabildiğince basit yapmaya çalışıyoruz ve sadece laptop ve televizyon markalarını adlarını ekleyip birde buton yerleştiriyoruz.

6. Urunler sayfası aşağıdaki gibi olacaktır.


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Urunler.aspx.cs" Inherits="Urunler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label runat="server" ID="labelShow"></asp:Label>
<br/>
<br/>
<asp:Button runat="server" ID="back" Text="Back"/>
</div>
</form>
</body>
</html>

7. Code behind tarafı aşağıdaki gibi olacaktır :

Code behind sayfası, laptop ve televizyon textini göstermek ve buton event handler ile kullanıcıyı default sayfamıza geri yönlendirmek için ilgili kodları barındırıyor.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Urunler : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{

// kullanıcı hyperlinke tıkladığında default sayfasından
//gelen itemid query string değerini oku
string laptopName = Request.QueryString["itemid"];

//şayet değer "8" ise label textinde "HP" yazısını göster
//değilse "Vestel" yazısını göster
labelShow.Text = laptopName == "8" ? "HP" : "DELL";

//geri button event handler
back.Click += new EventHandler(back_Click);
}

/// <summary>
/// geri button click event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void back_Click(object sender, EventArgs e)
{
//sayfayı default.aspx sayfasına transfer et
Server.Transfer("../default.aspx");
}
}

8. Modülü kullanabilmek için configuration dosyamızda HttpModule “URLRewriter” ayarını yapmamız gerekiyor.


<httpModules>
<add name="URLRewriter" type="URLRewriter"/>
</httpModules>

Kodlama işlemi tamamdır. Uygulamamızı test etmek için sayfayı refresh yapalım.

Default sayfamız aşağıdaki gibi görünecektir. Linklere tıklayarak yaptığımız işlemin sonucunu görebilirsiniz.

ReWritelinkler

 

 

 

 

Kolay Gelsin.

Muavenet

Web teknolojilerine merak salmış bir bilgisayar mühendisinin yazıları

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir