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

Coşkun Kurtuldu
7 min readJan 2, 2018

--

Mvc ile Dinamik SiteMap,Rss ve Url Route Yapısı

Merhabalar,

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

Karşımıza çıkan sorun şuydu: Asp.net Mvc projemizde 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ız gerekiyordu.

Öncelikli olarak mvc projelerinde Seo Route yapısı, SiteMap.xml nedir, Rss nedir tanımlarını aktarıp, örnek bir proje ile yazımı tamamlayacağım.

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ımlanabilir.

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.

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.

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ıştır.

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

Route Attribute özelliğinin kullanılabilmesi için öncelikli olarak RouteConfig.cs içerisinde RegisterRoutes metodu içerisine routes.MapMvcAttributeRoutes(); kodunun tanımlanması 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.

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.

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.

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

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

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.

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.

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.

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.

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 "";
}
}
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.

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.

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.

  1. Sitemizin url adresini dinamik olarak buluyoruz.
  2. sitemap.xml dosyası için gerekli olan urlset ve şema bilgilerini içeren bilgileri ekledik. Ayrıca sitemizin adını sitemap içerisine ekledim.
  3. Sitemap içerisine oluşturduğumuz haber listesinin url bilgisini ekledik.
  4. 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.
  5. Son adımda 2. adımda açmış olduğumuz url set etiketlerinin kapatılma işlemlerini tamamladık.

Önemli Not:

Sitemizi çalıştırdığımız zaman localhost:2480/sitemap.xml yazdığımız zaman 404 not found hatası ile karşılaşırız. Çünkü route config ayarımız içerisinde sitemizin “.xml” uzantılı bir sayfa ile çalışma ayarı bulunmamaktadır. Bunun için web.config dosyamızın içerisine aşağıdaki kodu eklediğimizde sitemap.xml dosyasına ulaşım sağlayabiliriz.

<system.webServer>
<handlers>
<add name="SitemapXml" path="sitemap.xml" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

Yukarıda bulunan kodu web.config dosyamıza ekledikten sonra sitemizi çalıştırıp sitemap.xml dosyasına erişim sağlamak istediğimizde aşağıdaki gibi bir görüntü karşımıza çıkacaktır.

Sitemap.xml ekranından bir görünüm

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.

  1. Sitemizin Url bilgisini alıyoruz.
  2. RSS dosyası için gerekli olan rss, version ve channel bilgilerini içeren bilgileri rss dosyasına içerisine ekliyoruz.
  3. 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.
  4. 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.

Oluşan Rss dosyasının görüntüsü aşağıdaki gibidir.

Dinamik Rss dosyasından bir görünüm

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

Kaynaklar:

http://www.borakasmer.com/asp-net-mvc-5de-attribute-routing/

http://www.semakudu.com/2016/11/asp-net-mvc-seo-link-olusturma.html

http://www.orhanyildirim.net/makale/Detay.aspx?MakaleId=asp-net/seo-url-yapilandirmasi-icin-kullanilabilecek-metod-41

https://rehansaeed.com/dynamically-generating-sitemap-xml-for-asp-net-mvc/

--

--

Responses (1)