URL Mapping veya ReWriting

0 dakikada yazıldı

11962 defa okundu

Düzenle

Bu aralar karşılaştığım ilginç sorulardan biri de URL Mapping hakkında.
İnternette gezerken dikkatinizi çekmiştir, bazı sitelerde
www.adres.com/bu+bir+makale/default.aspx
gibi adresler kullanılıyor. İşte buna URL Mapping deniyor. Bu
işlemi, aslında var olmayan bir adresi varmış gibi kullanarak esasen var
olan başka bir adrese arka planda yönlendirmek şeklinde
tanımlayabiliriz.

Örneğin:

www.ornek.com/urunler.aspx?ID=5

gibi bir adres yerine

www.ornek.com/5/default.aspx

şeklinde adresler kullanabiliyorsunuz.

Biz de bu konuda bir örnek yaparak yukarıdaki gibi bir adresi
dönüştürmeyi deneyelim. Örneğimizde kullanmak üzere bir default.aspx
yaratıyoruz ve basit bir şekilde sayfaya bir adet yerleştirerek
QueryString üzerinden gelecek ID bilgisini Label içerisine
yazdıracağız.

[default.aspx]

<%@ Page
Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

 

<!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
ID="Label1" runat="server" Text="Label"></asp:Label>

    </div>

    </form>

</body>

</html>

[default.aspx.vb]\

Partial Class _Default

    Inherits System.Web.UI.Page

 

    Protected Sub Page_Load(ByVal sender As Object,
ByVal e As System.EventArgs) Handles Me.Load

        Label1.Text = Request.QueryString("ID")

    End Sub

End Class

Sayfamızı hazırladığımıza göre sıra geldi mapping işlemini yapmaya.
Projemize bir adet Global.asax (Global Application Class) eklememiz
gerekiyor. Projeye "Solution Explorer" içerisinde sağ tuş tıklayarak
"Add new item" diyerek söz konusu dosyayı ekleyebilirsiniz. Sonrasında
Global.asax içerisinde Application'a ait BeginRequest durumunu
yakalayarak mapping kodumuzu yazacağız.

<%@ Application Language="VB" %>

 

<script runat="server">

    Protected Sub Application_BeginRequest(ByVal sender As Object,
ByVal e As System.EventArgs)

        Dim GelenAdres As String
= Context.Request.Url.AbsolutePath

        Dim GelenID As String
= GelenAdres.Substring(GelenAdres.IndexOf("/", GelenAdres.IndexOf("WebSite15")) + 1,
GelenAdres.IndexOf("default.aspx") -
GelenAdres.IndexOf("/",
GelenAdres.IndexOf("WebSite15")) -
2)

        Context.RewritePath("../default.aspx?ID=" & GelenID)

    End Sub

</script>

Gelelim yukarıda neler yaptığımıza. İlk satırda GelenAdres adında bir
değişken yaratarak buraya kullanıcının talepte bulunduğu adresin yolunu
kopyalıyorum. Bu adres metni içerisinde /5/ gibi duran ID bilgisini
almam gerekiyor. Ben bu işlemi standart String işlemleri ile yaptım,
oysa güzel bir RegularExpression çok daha hoş durabilir. İhtiyaçlarınıza
göre istediğiniz metodu kullanabilirsiniz. ASP.NET Development Server
kullandığım için benim sitem bir WebSite15 denen bir klasör içerisinde
açıldı. O nedenle string işlemlerimi şimdilik ona göre yazdım. Son
olarak da Context nesnesine ait RewritePath metodu ile esas
açılacak olan adresi belirtiyorum. Yakalamış olduğum ID bilgisini
adresin sonuna ekliyorum.

Artık
www.ornek.com/5/default.aspx
adresine giden kullanıcılar için aslında
www.ornek.com/default.aspx?ID=5
adresi açılıyor ama bunu hiçbir kullanıcı görmüyor. Örneği bir adım
ileri taşıyarak
www.ornek.com/Bu+bir+metin/default.aspx
şeklindeki adreslerin de
www.ornek.com/default.aspx?ID=5
şekline dönüşmesini sağlayabilirsiniz. Tek yapmanız gereken gelen başlik
bilgisini alip ona uygun ID'yi veritabanından çekerek yeni adrese
aktarıyor olmak.

Mapping yaptığımız tüm adreslerin sonunda .aspx uzantılı bir dosya
adresi kullandık. Bunun nedeni sadece .aspx uzantılı dosyaların IIS 6.0
üzerinde asp.net motoruna bağlı olması. Bu durum IIS'e admin erişiminiz
varsa özel ayarlarla tabi ki değiştirilebilir. Yakın zamanda Server 2008
lansmanı ile IIS7.0 da kullanıyor olacağız. IIS7.0'ın mimari yapısındaki
değişiklikler sonucu yukarıdaki kodu IIS 7.0 üzerinde çalıştırdığınızda
tüm istekler dosya uzantısına bakılmadan map edilebilecektir.

Yukarıdaki taktiğin yanı sıra HttpModule yazarak URL Mapping
işlemini daha performanslı bir hale getirmek de mümkün. Umarım o konuda
da yakında uzun bir makale yazma şansım olur :)

Hepinize kolay gelsin.