ایجاد 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 تشکر