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

دوشنبه 20 دی 1395

اضافه کردن 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 اضافه کنید که این ، تاریخ آخرین تغییرات را به خزنده ها می گوید . تاریخ آخرین تغییرات میتواند محاسبه شود، فقط کافیست که تاریخ آخرین تغییرات را از صفحه مربوطه دریافت کنید. 

آموزش asp.net mvc

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید