Yazılım Bir Tutku

Tecrübe ilimden üstündür !

SEO için global.asax ile sanal sayfalar oluşturma

Tarih : 16.06.2010 12:41:20 Kategori : ASP.NET Hit : 10124

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.

PAGE

<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")

            {
                //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 makaleye kadar kalın sağlıcakla...

Takip Ediyorum

Faydalı Projeler

Yorumlar

Akif dosya yolunu string Yol = Request.RawUrl; şeklinde tanımladık.

Diğer dizin sorununu ise dosyaları çağırırken root dizinine kadar inip çağırırsan çözebilirsin.

resimler cssde url('resim/resim1.png') şekilde kayıtlı diyelim. sanal klasör oluşturunca siteadi.com/haber/resim/resim1.png adresinden resim çağırıyor. orda resim olmadığı için resimler gözükmüyor. bunu nasıl çözebiliriz acaba ?

DosyaYolu nu nerde tanımladık burda ?

hocam peki adres çubuğunda geçen id yi de yok edebilirmiyiz acaba yani adres çubuğunu sadece /mobil-imzalayin-gitsin.aspx şeklinde yapmak için ne yapmamız lazım ?? yardımcı olabilirsen çok sevinirim..

Eksik demek doğru olmaz gibi geliyo. Çünkü yukarıdaki anlatımımda olduğu şekliyle hatasız olarak ihtiyaçlarınıza cevap vermekte.
Fakat her uygulamada olduğu gibi bu uygulamada çeşitli şekillerde geliştirilebilir.

İlgin için teşekkürler Burak.

üsteki makaleye global asax bolumu eksik gibi sanki dogrusu boyle olmalı degilmiydi ? void Application_BeginRequest(object sender, EventArgs e) { string address = Request.RawUrl; if (Path.GetExtension(address) == ".html") { string[] parca = address.Split('/'); Context.RewritePath("~/detay.aspx", "", "id=" + parca[2]); } }

Merhaba, hostumu kendim sağlıyorum dediğiniz gibi htm ve html uzantıları içinde aspnet_isapi.dll desteğini verince sorun düzeldi yalnız farkettimki html uzantılı olan sayfalar bu seferde sorun çıkartmaya başladı :) en güzeli uzantıları aspx yapmak olarak karar verdin en azından aspx uzantıları için isapi.dll desteği şart oldugundan kimse hostundan bişey istemek zorundada kalmayacaktır :) paylaşım için tşkler.

Merhaba ; Web sitenin barındırıldığı serverda domainine aspnet_isapi.dll desteği verilmemiş ise linklerinde olan sanal sayfalarını bulamayacağı için bu hatayı alıyor olmalısın. Hosting firman ile bu konuda iletişime geçerek aspnet_isapi.dll desteğini talep edersen sorunun çözülür.

merhaba verdiğiniz örneği localde denediğimde hiç bir problem yok yalnız web de gönderdiğim anda Not Found The requested document was not found on this server hatası alıyorum... sizce sebebi nedir?

global.asax üzerinden search.aspx için yapmış olduğunuz herhangi bir işlem varmı. Birde tam olarak butonun click olayındaki kodunuzu paylaşırsanız yardımcı olabilirim.

selam; makaleniz için teşekkürler...Bunu uyguladığımda herşey sorunsuz çalışıyor,linklerde falan problem olmuyor.Fakat site içi arama yaparken butonumun click olayı yani(Response.Redirect("search.aspx") çalışmıyor.Arkada başka bir sayfa arıyor ve saçma sapan bir url oluşuyor.Bunun nedeni nedir..?

Sizde Yorumda Bulunun

Konuya dair fikir ve sorularınızı paylaşın