Mvc ile Dinamik SiteMap, Rss Oluşturma ve MVC Url Route Yapısı

Merhaba,

 

Zaman zaman çalıştığım projelerden karşıma çıkan zorlukları ve bunlara bulduğum çözümleri aktarıp, hem ileride bana bir yol gösterici olması açısından hemde benim yaşadığım sıkıntıları çeken insanların yararlanabileceği bir kaynak olması olmasını istiyorum.

 

Bu gün projemde karşıma çıkan sorun şuydu: Asp.net Mvc projemde Seo uyumlu oluşturulan linkler için arama motorlarının anlayabileceği sitemap.xml ve Rss’in dinamik olarak oluşturulmasını sağlamam gerekiyordu.

Öncelikli olarak mvc projelerinde Seo Route yapısı, SiteMap.xml nedir, Rss nedir tanımlarını nedir bunun hakkında bilgi vermek istiyorum.

 

SiteMap Nedir?

Arama motoru botları web sitemize geldikleri zaman url bilgisini arayacakları ilk yer sitemap.xml dosyalarıdır. Genel bir tanımla sitemap, siteye uğrayan arama motoru botlarına siteyi daha iyi bir şekilde indexlemesine rehberlik eden bir dosyadır.

 

RSS Nedir?

Rss, çeşitli web sayfaları tarafından özellikle haber, blog gibi her zaman güncellenen sitelerin güncellemelerini kullanıcılarla anlık olarak paylaştıkları , içeriğin tek bir ortamdan izlenebilmesine olanak sağlanan içerik besleme sistemine verilen isimdir. RSS yöntemini destekleyen siteler hazırladıkları rss dosyalarını XML biçimli olarak hazırlamaktadırlar.

0.91 versiyonunda iken Rich Site Summary (Zengin Site Özeti) olarak adlandırılan RSS, 0.9 ve 1.0 olduğunda RDF Site Summary (RDF Site Özeti), 2.0.0 versiyona ulaştığında da Really Simple Syndication (Çok Basit Besleme) olarak adlandırılmıştır.

 

URL Nedir?

URL (Uniform Resource Loader),Standart kaynak bulucu en kolay tabirle internet adreslerinin ismidir. Diğer bir tanım ise web sitesinin serverda bulunduğu fiziki dosyanıın adresi olarak tanımlarız.

 

Mvc Url Routing Nedir?

İstemci (client) üzerinden sunucu (server) tarafına gönderilen isteği ilgili Controller metoduna yönlendirerek kullanıcının gözüne hoş gelecek bir URL oluşturularak, çeşitli güvenlik açıklarından kaçınıp arama motorlarının anlayacağı bir url oluşturulması sağlanır.

 

Asp.Net Mvc Seo Yapısı Ve Routing

Asp.Net Mvc 5 öncesinde route yapısı RouteConfig.cs sınıfı içerisinde aşağıdaki örnekte olduğu gibi tanımlanırdı.

 


routes.MapRoute(

name: "Default", //Yönlendirmenin adı

url: "{controller}/{action}/{id}", //Talep olarak gelecek url yapısı

 

defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } //Gelen talebin yönlendirileceği, Controller ve Action, varsa parametreler

);

 


 

Bu örnekte birden fazla controller üzerinde işlem yapacağımızı farz edelim. RouteConfig dosyası üzerinde birden fazla route class’ı oluşacağı için sayfalarımıza vereceğimiz seo uyumlu controllerları oluştururken isim karıştırma problemi yaşayabiliriz.

 

Mvc 5 ile birlikte gelen yenilikle RouteConfig.cs dosyasına bakmadan oluşturacağımız action başına ekleyeceğimiz [Route] attribute sayesinde seo uyumlu link oluşturabilmemize olanak sağlanmış oldu.

 


[Route("students")]
public ActionResult Class() { ... }

 


 

Route Attribute özelliğinin kullanabilmemiz için öncelikli olarak RouteConfig.cs içerisinde RegisterRoutes metodu içerisine routes.MapMvcAttributeRoutes(); kodunu tanımlamamız gerekmektedir.

 


public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}


 

Bu ayarı tamamladıktan sonra controller içerisinde kullandığımız tüm Action’ların başına [Route] attribute ile istediğimiz yönlendirmeyi yapıyor olacağız.

Öyleyse hemen örneğimize başlayalım. Günlük Teknoloji haberleri paylaştığımız bir sitemiz var bu sitemiz için seo uyumlu link oluşturalım.

News adında Controller’a sahibim. Bu controller içerisinde haberlerin listelendiği Index() ve haber detaylarının olduğunu Detail(int id) olarak tanımlanan 2 adet action olduğunu kabul ediyorum.

 

DinamikSiteMap

                         News controller görünümü

 

Öncelikli olarak models klasörümüz içerisine news adında bir class oluşturalım. Oluşturduğumuz news class’ımız aşağıdaki gibidir.

 

Rss Olusturma

                                                              News Class’ımız

 

Daha önceden oluşturduğumuz news controller içerisinde News Class’ımızı doldurup view kısmında gösterelim.

Bunun için öncelikli olarak oluşturduğumuz class’ımızı list tipinde tanımlayıp, bu listenin içerisini dolduralım.

Oluşturduğum News Controller içerisini aşağıdaki gibi tanımlıyoruz.

 

seo

                                                  News Class’ı doldurma Index Action’ı oluşturulması

 

Oluşturduğumuz Index view kod görünümü aşağıdaki gibidir.

 

erdogandurmaz

                                                                        Index view görünümü

 

Tarayıcımızda News/Index olarak baktığımızda aşağıdaki gibi bir görüntü elde ederiz.

 

web site

 

Gördüğümüz gibi kullanıcıya herhangi bir anlam ifade etmeyen ve arama motorları tarafından anlaşılmayacak bir link yapısı ortaya çıkmış oldu.

 

Bu sorunu engelleyebilmek için Index Action’ın başına [Route] attribute sayesinde seo uyumlu bir link yapısı oluşturmuş olacağız.

 

Bunun için aşağıda Index() action’ının route’u aşağıdaki gibi değiştirilmiştir.

 

seo

                                                                Değiştirilen Index sayfası seo link görünümü

 

Şimdi verilen Id’ye göre bir haberin görüntülenmesini sağlayalım. Bunun için NewsController’e aşağıdaki Action’u ekleyelim.

 

erdogandurmaz

                                                Oluşturulan NewsDetail Action Görünümü

 

Adres çubuğumuza http://localhost:….(burası farklıdır)/NewsDetail?newsId=1 adresini yapıştırdığımızda aşağıdaki gibi bir görüntü elde ederiz.

 

Yine bu oluşan link yapısı hem kullanıcılar için hemde arama motorları için herhangi bir anlam ifade etmemektedir.

 

Bunun için Detail Action’ını aşağıdaki gibi düzenliyoruz. Detail action route yapısını “haberler/kategori adı/egitim adı/ egitim id “ şeklinde seo uyumlu ve daha anlamlı linkler oluşturulmasını sağlayalım. Route yapımız [Route(“haberler/{category}/{newsTitle}-{newsId:int}”)] şeklinde oluyor.

 

erdogan durmaz blog

                                                          NewsDetail Action Route görünümü

 

Route yapımız bu şekilde değiştirildikten sonra türkçe karakter veya seo yapısına uymayan karakterler gönderilmemesi gerekmektedir.

 

Bunun için parametre olarak gönderdiğimiz category ve newsTitle değerlerini FriendlyURLTitle adında oluşturduğumuz metoda gönderip category ve newsTitle parametrelerinin seo uyumlu hale gelmesini sağlıyoruz.

 

Aşağıdaki helper metodu gönderdiğimiz parametreleri seo uyumlu hale getirmektedir.

 


public static string FriendlyURLTitle(this UrlHelper urlHelper, string incomingText)
        {
         
         if (incomingText!=null)
         {
             incomingText = incomingText.Replace("ş", "s");
             incomingText = incomingText.Replace("Ş", "s");
             incomingText = incomingText.Replace("İ", "i");
             incomingText = incomingText.Replace("I", "i");
             incomingText = incomingText.Replace("ı", "i");
             incomingText = incomingText.Replace("ö", "o");
             incomingText = incomingText.Replace("Ö", "o");
             incomingText = incomingText.Replace("ü", "u");
             incomingText = incomingText.Replace("Ü", "u");
             incomingText = incomingText.Replace("Ç", "c");
             incomingText = incomingText.Replace("ç", "c");
             incomingText = incomingText.Replace("ğ", "g");
             incomingText = incomingText.Replace("Ğ", "g");
             incomingText = incomingText.Replace(" ", "-");
             incomingText = incomingText.Replace("---", "-");
             incomingText = incomingText.Replace("?", "");
             incomingText = incomingText.Replace("/", "");
             incomingText = incomingText.Replace(".", "");
             incomingText = incomingText.Replace("'", "");
             incomingText = incomingText.Replace("#", "");
             incomingText = incomingText.Replace("%", "");
             incomingText = incomingText.Replace("&", "");
             incomingText = incomingText.Replace("*", "");
             incomingText = incomingText.Replace("!", "");
             incomingText = incomingText.Replace("@", "");
             incomingText = incomingText.Replace("+", "");
             incomingText = incomingText.ToLower();
             incomingText = incomingText.Trim();// tüm harfleri küçült
             string encodedUrl = (incomingText ?? "").ToLower();// & ile " " yer değiştirme
             encodedUrl = Regex.Replace(encodedUrl, @"\&+", "and");// " " karakterlerini silme
             encodedUrl = encodedUrl.Replace("'", "");// geçersiz karakterleri sil
          encodedUrl = Regex.Replace(encodedUrl, @"[^a-z0-9]", "-");// tekrar edenleri sil
             encodedUrl = Regex.Replace(encodedUrl, @"-+", "-");// karakterlerin arasına tire koy
             encodedUrl = encodedUrl.Trim('-');return encodedUrl;
         }
         else
         {
             return "";
         }}

 

 

helper metodu erdogan durmaz blog

                                           Url helper sınıfının kod görünümü

 

Bu şekilde ayarlarımızı yaptıktan sonra haberler liste sayfasında bulunan haberlerin yanına detayı görüntüle adında bir link koyalım ve tıklanan bu haberin detayına seo uyumlu bir yapıda,

FriendlyURLTitle metodunu kullanarak yönlendirme yapalım.

 

Bunun için News/Index view kodumuzu aşağıdaki gibi güncelliyoruz.

 

erdogandurmaz  URL Helper

                                                                    News/Index View görünümü

 


<a href="@Url.Action("NewsDetail","News",new { category=@Url.FriendlyURLTitle(item.Category), newsTitle= @Url.FriendlyURLTitle(@item.NewsTitle), newsId=@item.Id })">Detay</a>


 

Burada eklediğimiz url bilgisi ile News/NewsDetail için seo uyumlu link oluşturulmasını sağlamış olduk. Eklediğimiz category ve newsTitle için @Url.FriendlyURLTitle helperı kullanarak seo uyumlu olmayan metinleri seo uyumlu hale çevirmiş oluyoruz.

 

Index sayfasında detay linkine tıkladığımızda ise aşağıdaki gibi bir görünüm elde ederiz.

 

erdogan durmaz Vİew

                                                   News Detail Action görünümü ve Seo uyumlu link yapısı

 

Dinamik Sitemap.Xml Oluşturma

Yukarıda sitemap tanımını yaparken sitemap’in xml tabanlı dosyalar olduğundan bahsetmiştik. Şimdi News controller içerisine SiteMap adında bir Action oluşturuyoruz. Oluşturduğumuz bu Action içerisinde sitemap etiketlerini ve şemasını oluşturup, sitemiz içerisinde bulunan haber listesini ve haber detaylarını bu sitemap dosyası içerisinde gösterelim.

 

  • Sitemizin url adresini dinamik olarak buluyoruz.

 

  • sitemap.xml dosyası için gerekli olan urlset ve şema bilgilerini içeren bilgileri ekledik. Ayrıca sitemizin adını sitemap içerisine ekledik.

 

  • Sitemap içerisine oluşturduğumuz haber listesinin url bilgisini ekledik.

 

  • Haber listemize eklediğimiz tüm haberleri foreach döngüsü ile dönerek, haber detay için oluşturduğumuz Action’a newsId parametresi ile göndererek otomatik olarak haber detayı linklerinin oluşmasını ve bu oluşan linklerin sitemap içerisine eklenmesini sağladık.

 

  • Son adımda 2. adımda açmış olduğumuz url set etiketlerinin kapatılma işlemlerini tamamladık.

 

 

Dinamik RSS Oluşturma

Yukarıda Rss tanımını yaparken rss’in xml tabanlı dosyalar olduğundan bahsetmiştik. Şimdi News controller içerisine RSS adında bir Action oluşturuyoruz. Oluşturduğumuz bu Action içerisinde Rss etiketlerini ve şemasını oluşturup, sitemiz içerisinde bulunan haber detaylarını Rss dosyası içerisinde gösterelim.

 

  • Sitemizin Url bilgisini alıyoruz.

 

  • RSS dosyası için gerekli olan rss, version ve channel bilgilerini içeren bilgileri rss dosyasına içerisine ekliyoruz.

 

  • Haber listemizi foreach döngüsü ile dönüp, haber detayları için oluşturduğumuz Action’a newsId parametresi ile göndererek otomatik olarak haber detayı linklerinin oluşmasını ve bu oluşan linklerin rss dosyası içerisine eklenmesini sağladık.

 

  • Son adımda 2. adımda açmış olduğumuz rss, version ve channel bilgilerinin etiketlerini kapatıp rss dosyamızı ekrana yazdırıyoruz.

 

Kısaca özetlemek gerekirse sitemap.xml ve rss tanımlarını yaparak, Asp.net mvc route yapısı ve seo uyumlu link oluşturmayı sizlere aktarmaya çalıştım.

 

Ayrıca dinamik olarak sitemap.xml dosyası oluşturma ve dinamik olarak rss dosyası oluşturmayı sizlere elimden geldiğince anlatmaya çalıştım.

 

Faydalı olması dileğimle..