Osman KURT

Kendime Not

Seo İçin Global.asax ile Sanal yol Oluşturma

Merhaba arkadaşlar;
Bu makalemizde geliştirdiğimiz projelerimizde url adreslerimizi SEO ( search engine optimization ) Türkçe açılım olarak Arama Motoru Optimizasyonu na uyumlu hale getirmenin yollarından biri olan global.asax kaynaklı olarak nasıl yaparız bunu inceleyeceğiz.

Örneğin bir haber sitesinde yüzlerce haber databaseye kaydedilmiş olabilir ve tüm bu haberlerin detaylarının gösterimi için bizim tek bir page miz vardır ( Örnek : Haber-Detay.aspx ) . Klasik olarak bu haberleri göstermek amacıyla tarayıcıda http://domainisimi/Haber-Detay.aspx?HaberId=125 gibi bir Url gösterimi uygularız. Fakat bu durum SEO için çokta ideal bir seçenek değildir. İlgili projenin hedeflenen kelimelerde arama motorlarında üst sıralarda çıkması için arama motorlarının önem verdiği uygulamaları projelerimize yansıtmamız gerekir. Yani tarayıcının adres çubuğuna http://domainisimi/Haber-Detay.aspx?HaberId=125 gibi bir url değilde http://domainisimi/Haber/Haberin-Basligi.aspx ( burada aspx uzantı şart değildir.html veya istenilen herhangi bir kelimede getirilebilir, yada uzantı belirtilmeyebilir.Bu tamamen bizim tercihimize kalmış bir şey ) şeklinde bir url getirebiliyor olmamız lazım. Bunu sağlayabilmek içinse asp.net de birçok yolumuz var ve makalenin başındada belirttiğim gibi bunu global.asax yardımı ile nasıl yapacağımızı inceleyeceğiz.

<a href="/Haber/<%#Eval("HaberId")+"-"+ (Eval("Baslik") %>.aspx" alt=""><%#Eval("Baslik") %></a>

İlgili verileri veri tabanına bağlanarak aldığımızı varsayıyorum.Pagemizde yukarıda belirttiğimiz şekilde bir link verdiğimizde sistem şu şekilde işleyecektir:

Öncelikle projemizde bir Haber klasörü olmadığı halde "haber" kelimesi hedeflenen önemli bir kelime olduğu için her haberde ( projede yüzlerce haberin olduğu varsayılırsa bu demektirki arama motorları bu projede haber kelimesini o sayıda kayda alacak ve bu kelime bu projede yoğunluk kazanacak ) bu kelimeyi vurgulamak için sanal bir klasör oluşturduk. Haberin ID değeri ve son olaraksa eklenen haberin başlığınıda linkimize çektik.

Şimdi burada şu soru sorulabilir. İyide bizim Haber isminde bir klasörümüz ve o başlıkta bir pagemiz yokki ? Sırf biz Url'i bu şekilde yazdık diye istediğimiz olacak değilya !

Elbette sırf page bu komutu yazdık diye sistem bunu bu şekilde algılamayacak. Ama global.asax işte bu noktada imdadımıza yetişecek ve sisteme bizim olmasını istediklerimizi uygulatacak.

Yukarıdaki komutta aslında biz " eğer Haber-Detay.aspx sayfası çağrılırsa sen bunu Haber diye sanal bir klasör oluştur ve daha sonra haberin ID değerini ve başlığını ekleyerek adresi bu şekilde göster" dedik.

GLOBAL.ASAX


//Pagemizin url bilgisini Request.RawUrl ile alarak daha sonraki aşamalarda kullanabilmek adına string bir değer olarak atıyoruz.

string Yol = Request.RawUrl;

//Aldığımız string Url bilgimizin içerisinde Haber diye bir ifadenin geçip geçmediğiniz kontrol ediyoruz. IndexOf ile yapılan aramalarda sonuç bulunmaz ise geriye -1 değerinin döndürür. Dolayısı ile biz kontrolümüzü sonuç -1 den farklı ise şeklinde yapıyoruz.

if (DosyaYolu.IndexOf("/Haber/") != -1)
{

//Uzantımızı aspx olarak belirtmiştik ve buradada uzantımızı kontrol ediyoruz.
if (System.IO.Path.GetExtension(Yol) == ".aspx")

{

string[] path = System.IO.Path.GetFileName(DosyaYolu).Split('-');
//Son olarak bu durumda arka planda çağrılacak olan asıl page mizi ve detaylarının talep edileceği haberi belirtiyoruz..
Context.RewritePath( "/Haber-Detay.aspx", "", "HaberId=" + path[0], true);

}

else
{
//aksi durumda olmasını istediğimiz bir işlem varsa kodlarımızı bu kısımda belirtiyoruz

}

}

Ve uygulamanın sonunda sonuç ?


Her iki durumdada veriler pagemize istediğimiz şekilde geliyor. Tek fark url bilgisinde Sabit bir page ve artı olarakta ID değerlerinin yerine arama motorlarında çıkmayı hedeflediğimiz kelimeleri çekerek sanal sayfalar oluşturmuş oluyoruz.

Tabi bu uygulamada sistem yöneticinizin IIS üzerinden domaininize aspnet_isapi.dll desteğini vermiş olması gerekmekte. Aksi durumda bu uygulama sonuç getirmeyecektir.

Tercih tabiki size kalmış..

Bir sonraki makalede görüşmek dileğiyle;

Osman KURT

Yorumlar (7) -

  • Cenk

    6.2.2011 17:34:17 | Yanıtla

    2. İmagedeki Yolda Haberler Haber Olacak Galiba Smile))))))))))))))))))))))))

    Bir  de Eğer Bu Sayfada İleri Geri Mantığı Olsaydı Bu Olay Gerçekleşirmiydi.

    Tabi 6 - Askere Gidiyoruyum.aspx değilde Direk Haber/Askere Gidiyormuyum.aspx olsaydı..

    İyi Çalışmalar

    • osmankurt

      7.2.2011 06:52:26 | Yanıtla

      İleri geri mantığı için bişey diyemicem yazdığım kod da haber/askeregidiyorum.aspx yolu hata vercektir çünkü id değerini göndermem gerek. Haber/ yazısından sonra id degerini arayacaktır bulamayınca doğal olarak syntax error hatası vericek.
      Bunu yapmanın başka bir yolu da var tabi global.asax dosyasındaki ufak bir değişikle id değerini gösterme zorunluluğu ortadan kalkıyor.

  • Yusuf

    8.2.2011 07:28:29 | Yanıtla

    Url Routing! Seo için artık vazgeçilmez bir yaklaşım olacak ;)

    • osmankurt

      9.2.2011 04:03:09 | Yanıtla

      Bencede öyle olacak kullanımıda zor değil artık web yazılımı yapan kişiler bunun bir standart haline gediğinin farkındalar, kolay ve kullanışlı

  • hakan

    9.4.2011 06:55:23 | Yanıtla

    Bu makale bırcok sıtede var artık aynı makaleyı okumaktan mantıgı ve olayın gıdısatını ogrendık cok sukur yanlız benım takıldıgım bır noktayı belırtmek ıstıyorum ve cozumunu nedır merak edıyorum  bu ornekte sayfada herhangı bır css veya js dosyası olmadıgı ıcın goruntude herhangı bı sıkıntı yok cunku sayfa default olarak beyaz bır zemın uzerınde ve hıc bır style dosyası barındırmıyor gorsellıkle ısı yok ben bu sıstemı kendı sıteme uyguladıgımda css ve js dosyalarını gormuyor sanal dızınler olustugu ıcın onun ıcınde arıyor css ve js lerı buna nasıl bır coozum var acaba arkadaslar tsk edıyorum

    • osmankurt

      9.4.2011 14:43:32 | Yanıtla

      Öncelikle yorumunuz için teşkkür ederim çok açık sözlü br arkadaşımızsınız galiba :d
      Sorununuzun çözümüne gelince bende aynı hatayla karşılaştım ve çözümü ikinci bir master sayfası hazırlayarak hallettim. Sanal bir dizin oluşturduğu için dosyaları bulamıyor bende  css script ve masterpage içinde kullandığım resimleri bir dizin dışarıya çıkarttım. Yani dosya linkerinin başına ../ ekledim. Eğer sizde denerseniz sorunun çözüldüğünü görürsünüz.

  • Serkan kılıç

    25.5.2011 04:15:19 | Yanıtla

    merhaba osman arkadaşım. benim yapmak istediğim olay şu www.siteadi.com/erkek-urun yada www.siteadi.com/bayan-urun  uzantı vermek istemiyorum .aspx yada .html olarak bunu nasıl yapabilirim. yapmış olduğum örnek aşağıdaki gibidir:

    void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            Ayarlarim(RouteTable.Routes);

        }


        void Ayarlarim(RouteCollection routes)
        {
            routes.MapPageRoute("kategori", "bayan-kategori_{KategoriAdi}_{KategoriId}.aspx", "~/Urunler.aspx");
        
        }

    Link ise aşağıdaki gibi veriyorum.
    "bayan-kategori_<%#Ayarlarim.Seo(Eval("KategoriAdi").ToString()) %>_<%# Eval("KategoriId") %>.aspx"

    türünde verdiğimde .. kategori adını yazdırıyor ve .aspx olarak uzantı ekliyor sonuna bunu uzantısız nasıl yapabilirim acaba ?

Loading