ASP.NET
Network Akademi

Met Hostimg

“Bilgi paylaşıldıkça artar” sloganı ile .NET Platformuna ilişkin birikimlerin paylaşıldığı ASP.NET.TR Topluluğunda sizde “YAZAR” olmak için ; info@asp.net.tr e-mail adresine kendinizi anlatan bir e-mail göndererek başvuruda bulunabilirsiniz.

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

Mahmut TEMUR
ASP.NET
21.12.2010 01:45:47
Hit : 14828

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 DosyaYolu = 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.

     
    void Application_BeginRequest(Object sender, EventArgs e)
    {

string DosyaYolu = Request.RawUrl;

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..
               string[] path = System.IO.Path.GetFileName(DosyaYolu).Split('-');
                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...




BU İÇERİĞE YORUMDA BULUNUN


Bu MAKALE'ye yorum yapabilmek için Üye olmalısınız ...!


BU İÇERİĞE YAPILAN YORUMLAR

Mturkyilmaz
Localde işlem nasıl olmalı

Peki bunun localde nasıl denicez

"bu dll mi gerekli aspnet_isapi.dll

Temur
aspnet_isapi.dll

Merhaba Murat;

Eğer localinde framework kurulu ise aspnet_isapi.dll dosyası zaten C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll yolunda mevcuttur. Yani bu dll dosyasını ekstra olarak indirme durumun söz konusu değil.

qoko
bazı sorunlar

merhaba Mahmut çok güzel ve yararlı bir makale olmuş teşekkür ederim. Lakin ben bu konularda yeni olduğum için size bir kaç sorum olacak müsadenizle;

Şimdi
1- Global.asax dosyasi icinde yeni bir method yapıp bu koları içine mi yazacağız

2- if (DosyaYolu.IndexOf("/Haber/") != -1) Buradaki DosyaYolu Dediğimiz şey nedir?

3- Context.RewritePath( "/Haber-Detay.aspx", "", "HaberId=" + path[0], true); Burdakide "path[0]" dizisi nedir? nerede ne olarak tanımlanıyor.

Şimdiden teşekkür ederim. iyi çalışmalar..

Temur
cvp:bazı sorunlar

Merhabalar Gökhan;

tüm bu tanımlamaları;

void Application_BeginRequest(Object sender, EventArgs e)
{
//Bu kısma yazılacak..
}

scopları içerisinde yapıyoruz.

DosyaYolu için scop içerisinde string DosyaYolu = Request.RawUrl; şeklinde bir değişken tanımlarsın.

path dizisi için makalede gerekli düzenlemeyi yaptım. Atlamışım o kısmı makalede kusuruma bakma lütfen.

Yardımcı olması ümidiyle.
Saygılarımla

qoko
teşekkürler

gerçekten bu ilginize teşekkür ederim.. en kısa sürede deneyeceğim.

suhaduran
Sayfa gösteriminde sorun..

Merhaba Murat bey;

Yukarıdaki örneği birebir uyguladım. Kodlar çalışıyor fakat bir kaç sorun ile birlikte. Yapmış olduğum bir site için uyguladım. Sitedeki Makaleler sayfası için ilk olarak denedim. Makalelerin listelendiği ve okunduğu sayfa master page'den türüyor. Hyperlink'ten oluşan makale listesinin bulunduğu sayfada sorun yok, zira linkler de kodların etkisiyle seo için yapılmış ayarlar ile gelmekte sorun yok.

Ancak linke tıkladıktan sonra, makalenin gösterileceği ve yine master page'ten türeyen sayfaya geçiş yapıyoruz. Tamam yine sorun yok, sayfa açılıyor, tarayıcının adres bölümünde yapmış olduğumuz adresleme, makale geliyor, her şey güzel. Sorunumuz ise şu: Sayfadaki tüm image'lar ve css'ler yok. Uçmuş. Göstermiyor.

Ne yaptıysam çözemedim. Kafayı sıyırmak üzereyim. Bir yol gösterin lütfen. Teşekkürler.

Temur
Image ve css eklenmesi sorunu

Herhangi bir css dosyasını page nize dahil ettikten sonra sanal pageleri geçiş yaptığınız anda yine lgili imageleri ve css dosyasını sanal page nin bulunduğu dizinde arıyor. Oysaki ne öyle bir dizin var nede öyle bir page var. Bu nedenle css dosyasını veya image leri bulamamakta.

Çözüm için ise imagelerinizin veya css dosyanızın yolunu net olarak belirtmektir.
Örneğin :
<link href="StyleSheet.css" rel="stylesheet" type="text/css" />ş  eklinde değilde;

<link href="http://asp.net.tr/StyleSheet.css" rel="stylesheet" type="text/css" />
şeklinde bir tanımlama yapman durumunda sorunu çözersin. Yine imageler içinde aynı şekilde.

Yada siteurl diye bir fonksiyon tanımlarsın;
<link href="<%=fonksiyonlar.SiteUrl %>/StyleSheet.css" rel="stylesheet" type="text/css" /> bu şekilde çağırarakta sorunu çözebilirsin.

Kolay gelsin.

servansever
Merhaba

Yaptığım sitelerde Theme yöntemini kullanıyorum. Css i okumuyor yani bu konuda ne yapabilirim. Yardımcı olabilirmisiniz?