ایجاد sitemap.xml داینامیک برای ASP.Net MVC
دوشنبه 20 دی 1395اضافه کردن sitemap یکی از تکنیک های (SEO (Serach Engine Optimization میباشد که به بهبود رنکینگ سایت شما کمک میکند . در این مقاله sitmap.xml های static و Dynamic را بررسی خواهیم کرد . بیشتر تمرکز ما روی Dynamic SiteMap خواهد بود .
فایل 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
- ASP.net MVC
- 5k بازدید
- 13 تشکر