ایجاد sitemap.xml داینامیک برای ASP.Net MVC

اضافه کردن sitemap یکی از تکنیک های (SEO (Serach Engine Optimization میباشد که به بهبود رنکینگ سایت شما کمک میکند . در این مقاله sitmap.xml های static و Dynamic را بررسی خواهیم کرد . بیشتر تمرکز ما روی Dynamic SiteMap خواهد بود .

ایجاد sitemap.xml داینامیک برای ASP.Net MVC

فایل SiteMap.xml چیست ؟

سایت رسمی SiteMaps.org بهترین تعریف برای این مسئله را دارد :

SiteMap یک راه ساده برای webMasterها میباشد تا صفحات وب سایت خود را برای خزنده های موتور های جستجو معرفی و تایید کنند . بدین صورت که ، SiteMap یک فایل xml  است که دارای URLها و Metadataهای مربوط به هر URL می باشد . پس ، با وجود این فایل خزنده ها کارآمدی بیشتری برای سایت شما از خود نشان می دهند . 

خزنده‌های وب معمولا صفحات را از لینک های آن سایت و سایت های دیگر پیمایش میکنند . SiteMapها این داده ها را به این دلیل فراهم می آورند که تمامی لینک های سایت خود و MetaData های آن را تماما در اختیار خزنده قرار دهد . استفاده از SiteMap ضمانت نمی دهد که موتورهای جستجو سایت و صفحات شما را شامل بشوند اما این کمک را به خزنده ها میکند که در سایت شما ، کار خود را بهتر انجام دهند . 

مثالی از فایل SiteMap.xml :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
      <loc>http://www.example.com/</loc>
      <lastmod>2005-01-01</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.8</priority>
   </url>
   <!-- ... -->
</urlset>

همانطور که مشاهده می فرمایید ، هر URL در یک SiteMap شامل چهار MetaData میباشد :

• url - که خود آدرس می باشد . 
• lastmod (اختیاری) - تاریخ آخرین ویرایش . این به موتور های جستجو می گوید که آیا باید این صفحه را دوباره re-Index کنند یا خیر . 
• changefreq (اختیاری) - نمایش دهنده فراکانس تغییرات (این متا دیتا میتواند داده هایی نظیر daily , monthly - always , weekly , yearly و never را دریافت کند ) . این یک زمانی را برای موتورهای جستجو مشخص میکند که برای re-Index کردن صفحه در چه بازه ی زمانی باید بازگرداند . 
• Priority (اختیاری) : یک عدد از 0 تا 1 را دریافت میکند .  که اهمیت صفحه را در مقایسه با دیگر صفحات بیان دارد . 

سه پارامتر دریافتی بالا ، فقط به موتور های جستجو کمک میکند که بداند صفحه را باید index کنند یا اینکه چه زمانی دوباره باید صفحه را re-Index کنند . اما تضمین نمیکند که صفحه شما در موتور جستجو حتما باشد . 

آیا این همه تلاش بیهوده نیست ؟!

موتور های جستجو جعبه های سیاهی هستند ، که ما فقط میدانیم چه چیزی وارد آنها می شود و چه خروجی از آنها بدست می آید . به همین دلیل ما نمیتوانیم به شما قول دهیم که با اضافه کردن siteMap به سایت خود رتبه سایت شما حتما افزایش پیدا خواهد کرد ، اما Google این بیان را دارد که :

استفاده از SiteMap تضمین نمیکند که تمامی صفحات وب سایت شما توسط خزنده ها دیده و Index  شوند . اما این نکته را در نظر داشته باشید که در اکثره مواقع داشتن SiteMap مزیت دارد اما نداشتن آن هم عیب و ضرری برای سایت شما ندارد . 

ایجاد یک فایل SiteMap.xml ایستا :

در دنیای وب ابزارهای آنلاین بسیاری برای ایجاد Static SiteMap.xml وجود دارد . که شما میتوانید آن را در root پروژه خود استفاده کنید ؛ اما چون static می باشند هر سری که تغییراتی در سایت شما ایجاد شود ، شما مجبورید که بصورت دستی این فایل SiteMap.xml را بروزرسانی کنید . در صورتی که سایت شما زیاد دچار تغیرات نمی شود همین فایل های Static خوب است ، اما این را نیز در نظر داشته باشید که ایجاد فایل Dynamic SiteMap.xml کاری بس آسان و کاری بسیار با ارزش می باشد . 

ایجاد Dynamic SiteMap.xml برای ASP.Net MVC :

ایجاد Dynamic SiteMap.xml برای ASP.Net MVC کار زیاد مشکلی نمی باشد ، اما وارد کردن تمامی جزئیات و در نظر گرفتن تمامی آنها یک ذره کار می برد . ما با یک SitemapNode و frequency enumeration که در sitemap ما یک URL را نمایش میدهند ، شروع میکنیم :

SitemapNode و SiteMapfrequency 

public class SitemapNode
{
    public SitemapFrequency? Frequency { get; set; }
    public DateTime? LastModified { get; set; }
    public double? Priority { get; set; }
    public string Url { get; set; }
}
 
public enum SitemapFrequency
{
    Never,
    Yearly,
    Monthly,
    Weekly,
    Daily,
    Hourly,
    Always
}


حال ما باید یک مجموعه از SitMapNode ایجاد کنیم . در مثالی که در زیر ارائه میشود ، ما سه صفحه اصلی سایت خود را در نظر گرفته ایم Home , About , Cotact . سپس ، به سراغ اضافه کردن یک مجموعه از صفحه های Product ها میرویم . ما IDهر Product را از پایگاه داده میگیریم و Product URL مربوط به آن را میسازیم . 

توجه داشته باشید که URL نباید وابسته باشد برای همین ما از یک متد Extension به نام AbsoluteRouteUrl برای ایجاد این URL ها استفاده میکنیم ، به کد های زیر توجه فرمایید :

ایجاد مجموعه ای از SiteMapNode :

public IReadOnlyCollection<SitemapNode> GetSitemapNodes(UrlHelper urlHelper)
{
    List<SitemapNode> nodes = new List<SitemapNode>();
 
    nodes.Add(
        new SitemapNode()
        {
            Url = urlHelper.AbsoluteRouteUrl("HomeGetIndex"),
            Priority = 1
        });
    nodes.Add(
       new SitemapNode()
       {
           Url = urlHelper.AbsoluteRouteUrl("HomeGetAbout"),
           Priority = 0.9
       });
    nodes.Add(
       new SitemapNode()
       {
           Url = urlHelper.AbsoluteRouteUrl("HomeGetContact"),
           Priority = 0.9
       });
 
    foreach (int productId in productRepository.GetProductIds())
    {
        nodes.Add(
           new SitemapNode()
           {
               Url = urlHelper.AbsoluteRouteUrl("ProductGetProduct", new { id = productId }),
               Frequency = SitemapFrequency.Weekly,
               Priority = 0.8
           });
    }
 
    return nodes;
}
 
public class UrlHelperExtensions
{
    public static string AbsoluteRouteUrl(
        this UrlHelper urlHelper,
        string routeName,
        object routeValues = null)
    {
        string scheme = urlHelper.RequestContext.HttpContext.Request.Url.Scheme;
        return urlHelper.RouteUrl(routeName, routeValues, scheme);
    }
}

حال، تنها کاری که باقی می ماند این است که ما مجموعه SiteMapNode را به xml تبدیل کنیم :

تبدیل SiteMapNode به  xml :

public string GetSitemapDocument(IEnumerable<SitemapNode> sitemapNodes)
{
    XNamespace xmlns = "http://www.sitemaps.org/schemas/sitemap/0.9";
    XElement root = new XElement(xmlns + "urlset");
 
    foreach (SitemapNode sitemapNode in sitemapNodes)
    {
        XElement urlElement = new XElement(
            xmlns + "url",
            new XElement(xmlns + "loc", Uri.EscapeUriString(sitemapNode.Url)),
            sitemapNode.LastModified == null ? null : new XElement(
                xmlns + "lastmod", 
                sitemapNode.LastModified.Value.ToLocalTime().ToString("yyyy-MM-ddTHH:mm:sszzz")),
            sitemapNode.Frequency == null ? null : new XElement(
                xmlns + "changefreq", 
                sitemapNode.Frequency.Value.ToString().ToLowerInvariant()),
            sitemapNode.Priority == null ? null : new XElement(
                xmlns + "priority", 
                sitemapNode.Priority.Value.ToString("F1", CultureInfo.InvariantCulture)));
        root.Add(urlElement);
    }
 
    XDocument document = new XDocument(root);
    return document.ToString();
}

حال ما یک متد action به HomeController برای گرفتن sitemap خود ، اضافه می کنیم . به route آن توجه داشته باشید . توجه داشته باشید که امکان ایجاد یک فایل با پسوند xml. در MVC5 وجود ندارد ، اما این امکان در MVC6 وجود دارد ، برای داشتن توانایی اینکار ، لازم است که کد زیر را به Web.Config خود اضافه کنید :

SiteMap Action :

[RoutePrefix("")]
public class HomeController : Controller
{
    [Route("sitemap.xml")]
    public ActionResult SitemapXml()
    {
        var sitemapNodes = GetSitemapNodes(this.Url);
        string xml = GetSitemapDocument(sitemapNodes);
        return this.Content(xml, ContentType.Xml, Encoding.UTF8);
    }
}

Web.Config  امکان استفاده از پسوند را برای Route فراهم می آورد :

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


فایل های SiteMap Index :

برای بیشتر مردم ، کد بالا کفایت میکند . شما در فایل SiteMap خود تا سقف  50,000 لینک و حداکثر حجم 10 مگابایت می توانید داشته باشید . 

مشخص نیست که در صورت مراجعه خزنده های موتور های جستجو به فایل SiteMap ای که از محدودیت های بالا رد شده است ، چه اتفاقی رخ می دهد . اکثره سایت ها این مقدار لینک ندارند و معمولا محدودیت را رعایت میکنند . 

خب ، اینجاست که فایلهای sitemap Index وارد کار میشوند . این بدین صورت که در صورت تجاوز از محدودیت های بالا شما sitemap خود را به صفحات مختلف میشکنید و همه آنها را در یک فایل Index قرار میدهیم . زمانی که یک خزنده SiteMap.xml شما را مشاهده میکند ، فایل index را واکشی کرده و به ترتیب اندیس ها ، صفحات را مشاهده می کند . در زیر یک مثال از فایل index را مشاهده می کنید :


2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <sitemap>
      <loc>http://www.example.com/sitemap1.xml</loc>
      <lastmod>2004-10-01T18:23:17+00:00</lastmod>
   </sitemap>
   <sitemap>
      <loc>http://www.example.com/sitemap2.xml.gz</loc>
      <lastmod>2005-01-01</lastmod>
   </sitemap>
</sitemapindex>


همانطور که مشاهده میکنید ، شما این امکان را دارید که تاریخ آخرین تغییرات را به هر sitemap URL اضافه کنید که این ، تاریخ آخرین تغییرات را به خزنده ها می گوید . تاریخ آخرین تغییرات میتواند محاسبه شود، فقط کافیست که تاریخ آخرین تغییرات را از صفحه مربوطه دریافت کنید. 

دانلود نسخه ی PDF این مطلب