Bir çok internet sitesinde karşılaştığımız 2009/03/06/deneme.aspx gibi linkler kuşkusuz hepimizin hoşuna gitmiştir.Bu tür link sistemi ile sayfalarımız hem seo hemde kullanıcı dostu sayfalar haline gelmekte.Url rewrite ile bir çok makale var fakat yeterli olmadığını düşünerek ve yeni başlayan arkadaşlarımızın daha iyi anlayabilmeleri için bu işi genel kodlama ile yapmaya çalıştım.Kodlarından esinlendiğim için Gökhan Bağcı ve Sunalı arkadaşlarıma teşekkür ederim.
Lafı uzatmadan başlayalım hemen,biliyorum hepiniz beni bekliyorsunuz.
Öncelikle bu uygulama HttpModule ile yapılacağı gibi Global.asax ilede yapılabilir.Ben HttpModule kullanmayı tercih ettim.
Var olan bir projemiz var yada yeni bir proje yaratıcak isek Öncelikle projemize bir App_Code klasörü ekleyelim.
App_code Klasörümüze bir yane class ekleyelim.
Ve class içeriğimizi aşağıdaki gibi değiştirelim
1: public class extools
2: {
3: public static string ReWriterPath(string ID, string Baslik,string Tip)
4: {
5: //Adresimizi düzenliyoruz
6: string Temp = "";
7: Temp = Baslik.ToLower();
8: Temp = Temp.Replace("-", ""); Temp = Temp.Replace(" ", "-");
9: Temp = Temp.Replace("ç", "c"); Temp = Temp.Replace("ğ", "g");
10: Temp = Temp.Replace("ı", "i"); Temp = Temp.Replace("ö", "o");
11: Temp = Temp.Replace("ş", "s"); Temp = Temp.Replace("ü", "u");
12: Temp = Temp.Replace("\"", ""); Temp = Temp.Replace("/", "");
13: Temp = Temp.Replace("(", ""); Temp = Temp.Replace(")", "");
14: Temp = Temp.Replace("{", ""); Temp = Temp.Replace("}", "");
15: Temp = Temp.Replace("%", ""); Temp = Temp.Replace("&", "");
16: Temp = Temp.Replace("+", ""); Temp = Temp.Replace(".", "-");
17: Temp = Temp.Replace("?", ""); Temp = Temp.Replace(",", "");
18:
19: //Tip=1 ise video,Tip=2 ise Haber,Tip=3 ise Makale
20: switch (int.Parse(Tip))
21: {
22: case 1:
23: return "Video/" + DateTime.Now.Date.Year.ToString() + "/" + DateTime.Now.Date.Month.ToString() + "/" + DateTime.Now.Date.Day.ToString() + "/" + ID + "-" + Temp + ".aspx";
24: break;
25: case 2:
26: return "Haber/" + DateTime.Now.Date.Year.ToString() + "/" + DateTime.Now.Date.Month.ToString() + "/" + DateTime.Now.Date.Day.ToString() + "/" + ID + "-" + Temp + ".aspx";
27: break;
28: case 3:
29: return "Makale/" + DateTime.Now.Date.Year.ToString() + "/" + DateTime.Now.Date.Month.ToString() + "/" + DateTime.Now.Date.Day.ToString() + "/" + ID + "-" + Temp + ".aspx";
30: break;
31: default:
32: return "Makale/" + DateTime.Now.Date.Year.ToString() + "/" + DateTime.Now.Date.Month.ToString() + "/" + DateTime.Now.Date.Day.ToString() + "/" + ID + "-" + Temp + ".aspx";
33: break;
34: }
35: }
36: }
Bu class’ımızda adresimizi düzenleyip yeni adresimizi oluşturucaz.Bu Class ile işimiz bitti.Şimdi yeni bir class ekleyelim.
Default olarak class içeriği şöyle olucaktır.
1: public class Class1
2: {
3: public Class1()
4: {
5: //
6: // TODO: Add constructor logic here
7: //
8: }
9: }
Biz bu içeriği şöyle değiştirelim.
1: public class exHttpModule : IHttpModule
2: {
3: public exHttpModule()
4: {
5:
6: }
7: }
Artık bu class bir HttpModule haline geldi.Şimdi ise düzenlenmiş adresimizi yakalayıp ilgili sayfaya yönlendiricez.
1: public void Dispose()
2: {
3:
4: }
5:
6: public void Init(HttpApplication context)
7: {
8: context.BeginRequest += new EventHandler(Application_BeginRequest);
9: }
10: void Application_BeginRequest(Object sender, EventArgs e)
11: {
12: string mypath = HttpContext.Current.Request.RawUrl;
13:
14: if (mypath.IndexOf("Haber") != -1)
15: {
16: if (System.IO.Path.GetExtension(mypath) == ".aspx")
17: {
18: string[] path = System.IO.Path.GetFileName(mypath).Split('-');
19: HttpContext.Current.RewritePath("~/haber.aspx", "", "id=" + path[0], true);
20: }
21: }
22: if (mypath.IndexOf("Video") != -1)
23: {
24: if (System.IO.Path.GetExtension(mypath) == ".aspx")
25: {
26: string[] path = System.IO.Path.GetFileName(mypath).Split('-');
27: HttpContext.Current.RewritePath("~/video.aspx", "", "id=" + path[0], true);
28: }
29: }
30: if (mypath.IndexOf("Makale") != -1)
31: {
32: if (System.IO.Path.GetExtension(mypath) == ".aspx")
33: {
34: string[] path = System.IO.Path.GetFileName(mypath).Split('-');
35: HttpContext.Current.RewritePath("~/makale.aspx", "", "id=" + path[0], true);
36: }
37: }
38: }
Bu eklemeyi yaptığımızda,düzenlenmiş adresimizi yakalayarak ilgili sayfaya yönlendiriyoruz.
HttpModule içeriğimizin en son hali şu şekilde olucak
1: public class exHttpModule : IHttpModule
2: {
3: public exHttpModule()
4: {
5:
6: }
7: public void Dispose()
8: {
9:
10: }
11:
12: public void Init(HttpApplication context)
13: {
14: context.BeginRequest += new EventHandler(Application_BeginRequest);
15: }
16: void Application_BeginRequest(Object sender, EventArgs e)
17: {
18: string mypath = HttpContext.Current.Request.RawUrl;
19:
20: if (mypath.IndexOf("Haber") != -1)
21: {
22: if (System.IO.Path.GetExtension(mypath) == ".aspx")
23: {
24: string[] path = System.IO.Path.GetFileName(mypath).Split('-');
25: HttpContext.Current.RewritePath("~/haber.aspx", "", "id=" + path[0], true);
26: }
27: }
28: if (mypath.IndexOf("Video") != -1)
29: {
30: if (System.IO.Path.GetExtension(mypath) == ".aspx")
31: {
32: string[] path = System.IO.Path.GetFileName(mypath).Split('-');
33: HttpContext.Current.RewritePath("~/video.aspx", "", "id=" + path[0], true);
34: }
35: }
36: if (mypath.IndexOf("Makale") != -1)
37: {
38: if (System.IO.Path.GetExtension(mypath) == ".aspx")
39: {
40: string[] path = System.IO.Path.GetFileName(mypath).Split('-');
41: HttpContext.Current.RewritePath("~/makale.aspx", "", "id=" + path[0], true);
42: }
43: }
44: }
45: }
Class yapıları ile işimiz bitti.Şimdi sayfamızdan örnek bir adres gönderelim.
Projemizde default.aspx,haber.aspx,video.aspx ve makale.aspx şeklinde 4 tane sayfamız olsun.Default.aspx sayfamızda link sistemini oluşturalım.
Default.aspx:
1: //Yazdığımız class ile yönetemimizi kullanarak adresimizi düzenliyoruz.
2: <a href='<%=extools.ReWriterPath("1","Hayali Video Sayfası","1")%>'>Video</a><br /><br />
3: <a href='<%=extools.ReWriterPath("2","Hayali Haber Sayfası","2")%>'>Haber</a><br /><br />
4: <a href='<%=extools.ReWriterPath("3","Hayali Makale Sayfası","3")%>'>Makale</a>
Böylece adresimiz ilk eklediğimiz class da belirtmiş olduğumuz gibi
Video/2009/3/6/1-hayali-video-sayfasi.aspx gibi bir adrese dönüşmüş oldu.Linkimize tıkladığımızda httpmodule class’ımız adres çubuğundaki düzenlenmiş yeni adresi yakayarak ilgili sayafaya yönlendiriyor.
Ama projemizin çalışabilmesi için web.config dosyamıza aşağıdaki eklemeyi yapmalıyız.
1: <httpModules>
2: <add name="exModuleName" type="exHttpModule"/>
3: </httpModules>
System.web tagları arasına bu eklemeyi yaptığımızda artık projemiz seo dostu bir link sistemine sahip olmuş olucak.
Fakat burada sayfa uzantılarımız yine aspx olmakta.Sakın html beklemeyin.Html uzantılı sayfalara sahip olmak istiyor iseniz,sunucunuzdan ISS üzerinde ufak bir kaç ayar yapmanız gerekicek.Ayrıca bu projeyi birkaç oynama yaparak daha kısa hale getirebilirsiniz.
Kaynak ve örnek projeye buradan ulaşabilirsiniz
Her detayını tek tek anlatamanın çok uzun olacağını düşünerek,kısa ve öz olarak anlatmaya çalıştım.Hepinize bol .Net li günler





Teşekkür ettim üstad. Gerçekten çook ihtiyaç duyuyordum.
Dersi mükemmel anlatmışsın… TeÅŸekkürler…..
Üstad Öncelikle Yine teÅŸekkür ederim ancak dediÄŸin gibi yaptım ama bir hatanın yeni farkına vardım. Åžimdi ben bu senin yazdıklarını dataset’in içerisine gömdüm yani dataset’te Makale aldırdım ID=1 olan makalenin baÅŸlığı ByBugu olsun. Bu ByBugu nun üstüne gelip tıkladığım’da tamam güzel bir ÅŸekilde çalışıyor makale.aspx e istediÄŸim bilgileri yazdırabiliyorum ancak datasette ID=2 olan satır olursa iÅŸler karışıyor. Direk Default.aspx’e yönlendirior beni. Bu hatayı neyden yapar ve nasıl düzeltebiliriz yardımcı olabilirmisin ? Åžimdiden teÅŸekkür ederim. (Buraya yazdım çünkü burda makale yazmışsın ve bu makale ile ilgili olan bir problem bunu burda eÄŸer yazarsam hem benim için hemde aynı uygulamayı yapan kiÅŸiler için daha iyi olur diye düşündüm.) İyi günler kolay gelsin…
Tamam üstad çözdüm. extools.cs dosyasındaki switch li kısımı kaldırırsam yani sadece bir satırlık return döndürürsem eÄŸer sorun düzelmiÅŸ oluyor. Tekrar TeÅŸekkürler…
Öncelikle çok başarılı anlatışmış bir makale olduğunu sölemek istiyorum.
Yanlız makalede anlatılan teknik sanırım altki gibi linklere çözüm bulmuyor.
http://www.siteadi.com/turkey yani bunun ülke olduğunu anlamamız için şu şekilde çalıştırıyoruz http://www.siteadi.com/ulkeler/turkey
Site içinde link verdiÄŸimizde tip_id’sine atıyorum 5 vererek bunun ülke olduÄŸunu anlıyabiliriz linkde göstermeden ama google’a indexlendiÄŸinde google nasıl anlıcak içinde gizli bir tip id olduÄŸunu ?
ayrıca soru 2
sayfada postback yaptığımızda neden link değişiyo ?
Adreslerimizi farkında iseniz 2009/03/09/01-deneme.aspx şeklinde gönderiyoruz.Buradaki 01 bizim id numaramız olmakta.Yani id miz yine adres de yerini alıyor.Sadece bu sefer sonda değil başta yerini alıyor.
2.sorunuz ise;O sorunun farkındayım,bir çözüm getirince buraya yazıcam.
tamam o zaman takibe alıyoruz sitenizi
Postback sonucunda ortaya çıkan sorunun çözümüne şu adresden ulaşabilirsiniz arkadaşlar;
http://www.bybugu.com/index.php/2009/03/11/url-rewrite-ve-postback/
Teşekkürler byBugu ilgin için
bu iÅŸlemler ile post back sonucu url adresinin eski haline geri dönmesi önlenmiÅŸ oluyor bu doÄŸru. Ancak diyelim butona tıklandığında label’e biÅŸeyler yazdırsın. Butona tıklanınca post back oluyor ve url adresi bizim istediÄŸimiz yere gidiyor ancak label’a hiç bir ÅŸey olmuyor yani sayfayı ilk açtığımız hali bizim karşımıza çıkıyor. Ben butona tıkladıgımda onun iÅŸlev yapmasını ve sonucunu da görmek istiyorum, bunun çözümü nedir ?
Bilmem sorunumu anlatabildin mi ?
Fatih Bey,
Eğer asp.net ile url rewrite işlemi yapmak istiyor iseniz,bloğumda bulunan diğer konuyu inceleyiniz.Bu yöntem de bazı sorunlar oluşmakta.Bu yazının amacı yöntemi daha iyi kavrayabilmektir.
Dostum , bravo sana .. Bir kac yerden baktım bu işi senden iyi anlatan yok
Öncelikle gerçekten güzel bir yazı olmuş.Fakat benim yapamadığım şu: Örneğin sayfada datalist içerisinde farklı ID lerde birşeyler gösterdik ekranda.Tıkladığımda diğer sayafaya gidiyor evet.Peki o id ye ait olan bilgileri nasıl diğer sayfada göstercem.yani normalde request.QueyString ile alabiliyoruz bunda nasıl yapacağız
Merhaba,diğer sayfadan id nizi yine aynı şekilde çekeilirsiniz.Yani url rewrite yapmadığımız url gibi düşünün.Request.QueryString ile çekebilirsiniz.Değişen bir şey yok.Kolay gelsin.
Çok güzel bir makale ellerinize sağlık. Benim bir sorum olacak. Uzantı yapmazsak nasıl olur?
Yani URLReWriteOrnek1/Video/2009/10/2/1-hayali-video-sayfasi.aspx yerine:
URLReWriteOrnek1/Video/2009/10/2/1-hayali-video-sayfasi olsa?
Nasıl yapabiliriz?
Merhaba;
EÄŸer uzantısız adresler oluÅŸturmak istiyor iseniz; asp.net mvc framework ‘ünden yararlanabilirsiniz.Bu yöntemle mümkün deÄŸil malesef.Ayrıca bloÄŸumda bulunan asp.net url rewrite 2 konusuna da bir göz atmanızı tavsiye ederim.O yöntem bu yöntem daha kolay ve daha sade dir.
Tekrar selamlar.
Ben bu yöntemi bir projeme uyguladım az önce.
Ancak acayip bir sorun var.
Anasayfa’dan makaleler.aspx sayfasına gidiyor ve urlrewrite yapıyor hiçbir sorun yok ama,
makaleler.aspx sayfasını basarken css’i görmüyor. Normalde gören ÅŸey urlrewrite yaparken görmüyor. Nedir bunun sebebi?