SEO برای وب سایت های ASP.NET : به دست آوردن محتوای ایندکس شده
Loading...
SEO برای وب سایت های ASP.NET

این مقاله، آخرین مقاله از سری مقاله های SEO برای وب سایت های ASP.NET برای موتورهای جستجو می باشند. هر مقاله در این سری آموزشی روی یک موضوع خاص تمرکز کرده و به ویژگی ها و ابزارهای موجود برای توسعه دهندگان ASP.NET می پردازد تا سایت ها را دلخواه موتورهای جستجو ساخته و از این رو رتبه بندی و کلیک سایت از طریق نتایج جستجو را بهبود ببخشد. این مقاله به این مسئله می پردازد که چگونه مطمئن شویم که موتورهای جستجو از همه محتوایی که ما می خواهیم خزنده های آن ها اطلاع پیدا کنند، باخبر می شوند و چگونه وقتی که مکان محتوایی دیگر معتبر نیست به آن ها اطلاع دهیم.

سری کامل مقاله ها شامل

  • محتوا – توصیف محتوای شما برای موتورهای جستجو
  • آدرس ها – چگونه آدرس های خود را برای جستجو بهینه کنیم.
  • فهرست گذاری – مکانیسمی که کمک می کند مطمئن شویم قسمت های درستی از سایت ما توسط موتورهای جستجو یافت می شوند.

می باشد.

نقشه سایت

موتورهای جستجو معمولا لینک ها را دنبال می کنند که به این صورت است که تصویری از شبکه جهانی وب برای خود می سازند. اگر محتوای سایت شما به خوبی لینک دهی شده باشد، بیشتر موتورهای جستجو قادر خواهند بود تا همه محتوای شما را مکان یابی کرده و در آن بخزند. با این حال ممکن است شما بخواهید یک نقشه سایت ساخته و در موتورهای جستجوی Google و Bing یا هر موتور جستجوی دیگری ثبت نمایید تا مکان محتوای شما را راحت تر پیدا کنند، همچنین به آن ها کمک کنید تا درباره آن محتوا بیشتر بدانند مانند اهمیت نسبی آن درمیان تمام محتوای دیگر سایت شما یا چه زمانی آخرین تغییر را داشته است.

SEO برای وب سایت های ASP.NET

نقشه سایت یک سند متنی ساختاریافته است. Google و Bing به طور معمول از چندین فرمت مبتنی بر XML شامل Sitemap 0.9، RSS 2.0 و ATOM 1.0 پشتیبانی می کنند. آن ها همچنین فرمت های دیگری را به صورت منحصر به فرد پشتیبانی می نمایند. نقشه سایت باید شامل آدرس همه صفحاتی باشد که شما می خواهید خزنده های موتورهای جستجو ببینند و ایندکس نمایند. یک API در فریمورک .NET برای ساختن خوراک (feed) RSS و ATOM وجود دارد. این API را می توان در فضای نام System.ServiceModel.Syndication یافت. هیچ چیزی برای پشتیبانی پروتکل نقشه سایت وجود ندارد، اما ساختار ساده ای است و ساختن تولید کننده نقشه سایت خود چندان دشوار نیست. ابتدا، در اینجا مروری بر ساختار خواهیم داشت:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.mikesdotnetting.com/</loc>
    <lastmod>2015-12-01T12:00:00Z</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.5</priority>
  </url>
</urlset>

ریشه این سند متنی urlset می باشد که شامل مجموعه ای از گره های url است. تنها گره ای که درون المنت url لازم است loc می باشد، که شامل آدرس مربوط به منبع است. گره lastmod زمان آخرین تغییری که روی منبع ایجاد شده را به فرمت W3C نگه می دارد. شما می توانید از گره changefreq برای پیشنهاد تکرار هر به روزرسانی احتمالی منبع با استفاده از یکی از گزینه های لیست از پیش تعریف شده، استفاده نمایید. درنهایت، گره priority این امکان را می دهد که به موتور جستجو بگویید می خواهید چه میزان الویتی از ۰.۱ تا ۱.۰ نسبت به سایر منابع روی سایت به این منبع بدهید. راهنمایی درباره نحوه استفاده از این معیار در سایت sitemaps.org فراهم شده است.

SEO برای وب سایت های ASP.NET

نیازمندی ها برای تولید یک نقشه سایت: یک کلاس برای ارائه نقشه سایت و آیتم های آن؛ یک نوع داده شمارشی برای مقادیر changefreq؛ یک ابزار برای پر کردن آیتم ها؛ و یک روش برای سریال سازی نقشه سایت پر شده به XML. ابتدا کلاس های موردنیاز برای Sitemap و آیتم های آن:

public class SiteMap
{
    public List&lt;SiteMapItem&gt; Items { get; set; }
}

public class SiteMapItem
{
    public Uri Loc { get; set; }
    public DateTime? LastMod { get; set; }
    public ChangeFrequency ChangeFreq { get; set; }
    public double? Priority { get; set; }
}

در اینجا نوع داده شمارشی changeFrequency را داریم که تضمین می کند که فقط مقادیر معتبر برای انتخاب در دسترس هستند:

public enum ChangeFrequency
{
    NotSet,
    Always,
    Hourly,
    Daily,
    Weekly,
    Monthly,
    Yearly,
    Never
}

کلاس SiteMapWriter مسئول سریال سازی شی Sitemap به XML می باشد. این کلاس به فضای نام های System.Linq و System.Xml متکی است، بنابراین باید با استفاده از دایرکتیو using این فضای نام ها را به برنامه اضافه کنیم:

public class SiteMapWriter
{
    private SiteMap _siteMap;

    public SiteMapWriter(SiteMap siteMap)
    {
        _siteMap = siteMap;
    }

    public void WriteTo(XmlWriter writer)
    {
        XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9";
        var xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
            new XElement(ns + "urlset",
                    _siteMap.Items
                    .Select(item =&gt; new XElement(ns + "url",
                        new XElement(ns + "loc", item.Loc),
                                    item.LastMod.HasValue ? new XElement(ns + "lastmod", item.LastMod.Value.ToString("s") + "Z") : null,
                                    item.ChangeFreq != ChangeFrequency.NotSet ? new XElement(ns + "changefreq", item.ChangeFreq.ToString().ToLower()) : null,
                                    item.Priority.HasValue ? new XElement(ns + "priority", item.Priority.Value) : null
                                )
                            )
                        )
                    );
        xml.Save(writer);
    }
}

این کد شی Sitemap را گرفته روی ویژگی Items که مجموعه ای از SiteMapItems است، یک حلقه تکرار می زند. برای هر آیتم گره های url را تولید می کند، تنها گره های فرزندی که مقدار تخصیص داده شده دارند، به عنوان خروجی تحویل داده می شوند. نحوه ساخت نقشه سایت به طبیعت سایت شما بسیار وابسته است. نقشه سایت ما از داده های بازیابی شده از دیتابیس در طول یک سری کدهای صفحه اصلی ایجاد می شود.

public SiteMap GetSiteMap()
{
    using (DotnettingContext context = new DotnettingContext())
    {
        var items = context.Articles.Select(a =&gt; new 
        {
            ID = a.ArticleID,
            Title = a.Headline,
            LastModified = a.DateAmended,
            DateCreated = a.DateCreated
        }).ToList().Select(i =&gt; new SiteMapItem
        {
            Loc = new Uri(string.Format("http://www.mikesdotnetting.com/article/{0}/{1}", i.ID, i.Title.ToSlug())),
            ChangeFreq = ChangeFrequency.Daily,
            LastMod = i.LastModified ?? i.DateCreated
        }).ToList();

        items.Add(new SiteMapItem {
            Loc = new Uri("http://www.mikesdotnetting.com"),
            ChangeFreq = ChangeFrequency.Hourly
        });
        return new SiteMap { Items = items };
    }
}

اگر شما سایت وب فرم داشته باشید، یک handler جنریک (فایل .ashx) انتخاب خوبی برای نمایش دادن نقشه سایت می باشد.

public class sitemap : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var service = new SiteMapService();
        var siteMap = service.GetSiteMap();
        var siteMapWriter = new SiteMapWriter(siteMap);
        using (var output = XmlWriter.Create(context.Response.Output))
        {
            context.Response.ContentType = "text/xml";
            siteMapWriter.WriteTo(output);
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

کد بالا فرض می کند که متد GetSiteMap در کلاس SiteMapService جای گرفته است. شما می توانید آن را هر جایی که بسته به سایت شما مناسب است، قرار دهید. سپس زمانی که handler درخواست شده و متد ProcessRequest به وسیله ASP.NET runtime فراخوانی می شود، XML تولید شده به وسیله کلاس SiteMapWriter را گرفته و آن را روی Response می نویسد.

در یک اپلیکیشن MVC، احتمالا بخواهید یک ActionResult سفارشی برای نقشه سایت ایجاد نمایید:

public class SiteMapResult : ActionResult
{
    private SiteMap _siteMap;

    public SiteMapResult(SiteMap siteMap)
    {
        _siteMap = siteMap;
    }

    public override void ExecuteResult(ControllerContext context)
    {

        context.HttpContext.Response.ContentType = "text/xml";

        var siteMapWriter = new SiteMapWriter(_siteMap);

        using (var output = XmlWriter.Create(context.HttpContext.Response.Output))
        {
            siteMapWriter.WriteTo(output);
        }
    }
}

کد این قسمت بسیار شبیه handler جنریک است. تفاوت عمده این است که نقشه سایت به جای ساخت شی از آن در کلاس به سازنده ActionResult ارسال می شود. SiteMapResult در controller action استفاده می شود:

public SiteMapResult SiteMap()
{
    var siteMap = _service.GetSiteMap();
    return new SiteMapResult(siteMap);
}

زمانی که نقشه سایت را ایجاد کردید، باید به موتورهای جستجو درباره آن بگوییم. دو راه برای این کار وجود دارد. روش اول این است که نقشه سایت را به صورت تک به تک در هر موتور جستجویی ثبت کنیم. Google و Bing هر دو ابزارهای وب مستری فراهم کرده اند که شما را قادر می سازند که نقشه سایت خود را در آن ها ثبت کنید. درباره بقیه موتورهای جستجو مطمئن نیستیم، اما حدس می زنیم که جستجو درباره چنین ویژگی و ثبت نام های تک به تک وقت گیر خواهد بود. خوشبختان، راه دوم برای اطلاع رسانی به موتورهای جستجو درباره نقشه سایت شما بسیار آسان تر است: این کار را در فایل robots.txt خود انجام دهید.

Robots.txt

فایل Robots.txt روشی برای صاحبان سایت است که دستورالعمل های خود را شامل خزنده های موتورهای جستجو درباره اینکه چه چیزهایی را باید درنظر بگیرند و چه چیزهایی را در نظر نگیرند به روبات های وب بدهند. یک فایل متنی استاندارد است، اما در فولدر ریشه سایت شما قرار گرفته است. این فایل به وسیله خرنده ها درخواست داده می شود که مشاهده کنند چه چیزی به عنوان /robots.txt standard شناخته شده است. محتوای فایل robots.txt به شکل زیر است:

sitemap: http://www.mspsoft.com/sitemap

user-agent: *

disallow: /downloads/

خط اول شامل دستور sitemap و اشاره به آدرس معیار سایت ماست. خط دوم آنچه که در ادامه باید به همه عوامل کاربر اعمال شود را مشخص می کند (bots/crawlers و…). خط سوم می گوید که محتوای دایرکتوری downloads نباید ایندکس شود. این دایرکتوری فایل های فشرده کمی را نگه می دارد که شامل نمونه های کد کاربردی برای برخی از مقاله های ماست. مقاله شامل یک لینک به دانلود فایل می باشد بنابراین موتور جستجو قطعا آن را توسط خزنده هایش پیدا می کند. همچنین فایل ها را با اضافه کردن rel =”nofollow” به خود لینک دانلود از جلوی دید موتور جستجو برداشتیم، اما این روش دو نقص عمده دارد: اول، ما مجبوریم که هر بار و همیشه این کار را به یاد داشته باشیم، دوم اینکه کس دیگری بدون اضافه کردن صفت nofollow به فایل فشرده ما لینک بدهد.

ممکن است شما دچار وسوسه شوید که فایل robots را از دنبال کردن عکس ها، فایل های جاوا اسکریپت و css باز دارید. با این حال، این ایده بدی است. Google در برخی درخواست های خاص به این فایل ها دسترسی پیدا می کند بنابراین می توانند تمام صفحه شما را همانطور که کاربر می بیند دانلود نمایند، تا حدی که می توانند به سرعت دانلودی که در الگوریتم رتبه بندی آن ها نقش دارد، دسترسی پیدا کنند. درواقع، آن ها اظهار دارند انسداد این منابع ممکن است در رتبه بندی بهینه فرعی سایت شما نتیجه خوبی داشته باشد.

کدهای وضعیت HTTP

در بسیاری از سایت های داینامیک در حال تحول، چندان عجیب نیست که ساختارهای URL تغییر کنند و آیتم ها جابجا شده یا ناپدید شوند و در دسترس نباشند. همچنین این یک حقیقت است که آدرس های شما می توانند خرد شوند زمانی که بازدیدکنندگان شما اقدام به تکثیر آن ها در سایت خودشان، در فروم ها، رسانه های اجتماعی و… می کنند. استفاده صحیح از کدهای وضعیت HTTP بهترین ابزار شما برای اطلاع رسانی به موتورهای جستجو درباره هر به روزرسانی است که آن ها باید زمانی که تلاش می کنند محتوایی را دنبال کنند که دیگر وجود ندارد، یا هرگز در این مکان وجود نداشته، یا جابجا شده است، روی ایندکس خود انجام دهند. کدهای وضعیت HTTP بسیار رایجی که شما با آن ها کار خواهید کرد در زیر آمده است:

  • ۳۰۱ – Moved Permanently به طور دائمی جابجا شده است.
  • ۳۰۲ – Found (Moved Temporarily) به طور موقت جابجا شده است.
  • ۴۰۴ – Not Found یافت نشد.
  • ۵۰۰ – Internal Server Error خطای داخلی سرور

SEO برای وب سایت های ASP.NET

۳۰۱ – به طور دائمی جابجا شده است برای اطلاع به موتورهای جستجو استفاده می شود که آدرسی که آن ها درخواست کرده اند به طور دائمی با آدرس دیگری جایگزین شده است. این کد وضعیتی است که اگر شما یک فایل .aspx را به طور مستقیم درخواست نمایید به وسیله فریمورک Friendly URLs برگردانده می شود. همچنین اگر redirectType را به عنوان permanent مشخص نمایید این کد به وسیله URL Rewrite module نیز برگردانده می شود. همچنین زمانی که در وب فرم یا متدهای RedirectPermanent یا RedirectToRoutePermanent در ASP.NET MVC از Response.RedirectPermanent استفاده می کنید ۳۰۱ برگردانده می شود. زمانی که کد ۳۰۱ را برمی گردانید، هر مقدار SEO ای که URL اصلی به دست آورده است به مکان جدید منتقل خواهد شد.

۳۰۲ – به طور موقت جابجا شده است از لحاظ SEO هیچ هدف سودمندی را دنبال نمی کند. کد وضعیتی است که هر زمان که شما از Response.Redirect در وب فرم یا action متدهای Redirect و RedirectToRoute در MVC استفاده نمایید، تولید می شود. زمانی که کد ۳۰۲ برمی گردانید، هر مقدار SEO ای که URL اصلی دارد در همان آدرس قبلی باقی می ماند. ایندکس های موتور جستجو نیز به روزرسانی نمی شود.

۴۰۴ – یافت نشد به موتور جستجو اطلاع می دهد که URL درخواست شده معتبر نیست و هیچ جایگزینی هم برای آن نیست. موتورهای جستجو چنین آدرسی را از ایندکس خود دور خواند ریخت. توصیه کارشناسان SEO این است که باید به جای بسنده کردن به صفحه پیش فرض ۴۰۴ وب سرور یک صفحه سفارشی ۴۰۴ با راهبری جایگزین فراهم نمایید. به این ترتیب با احتمال بیشتری می توان بازدید کننده را حفظ کرد.

۵۰۰ – خطای داخلی سرور زمانی برمی گردد که خطای مدیریت نشده ای در وب سرور اتفاق بیفتد. به طور ایده آل، شما نباید هرگز این کد وضعیت را برگردانید. با این حال، پیشامدهایی خارج از کنترل شما وجود دارد که منجر به خطای مدیریت نشده ای مانند از دست رفتن اتصال دیتابیس، جابجایی فایل ها، بالا نبودن سرور SMTP و… شود. شما باید همه خطاهای ۵۰۰ را لاگ گرفته و علت آن ها را بررسی نموده و درصورت امکان حل نمایید. اگر به عنوان مثال اپلیکیشن شما exceptionای تولید کند به این دلیل که درخواست حاوی آدرس خراب کرده باشد – شما انتظارش دارید و سعی می کنید تا یک مقدار int را در کد خود پردازش نمایید، اما اگر آدرس از دست رفته یا خارج از محدوده مقادیر مورد انتظار بود، برای مثال – باید یک exception جدید با کد وضعیت ۴۰۴ برگردانده و صفحه سفارشی ۴۰۴ را نمایش دهید.

پیکربندی صفحات خطای سفارشی با کد وضعیت صحیح

این قسمت نشان می دهد که چگونه صفحات خطای برای کدهای ۴۰۴ و ۵۰۰ در وب فرم و MVC5 و نسخه های پایین تر ایجاد نمایید. بسیاری از مثال های موجود نشان می دهند که چگونه با استفاده از customErrors در فایل web.config خطاهای سفارشی را پیکربندی نمایید. این فقط باید زمانی استفاده شود که شما واقعا از میزبانی IIS 6 استفاده کنید. ما استفاده از بخش httpErrors در system.webServer را توصیه می کنیم. اگر این روش را دنبال کنید، باید قسمت customErrors را حذف نمایید.

در اپلیکیشن وب فرم، باید صفحات مجزایی برای کنترل خطاهای ۴۰۴ و ۵۰۰ ایجاد نمایید. در MVC، باید viewهای جداگانه ای بسازید. Page/view خطای ۴۰۴ زمانی نمایش داده می شود که منبع موردنظر یافت نشود. از این رو می تواند به طور ایمن از master یا layoutpage هایی استفاده کند که شامل محتوای داینامیک از دیتابیس مانند سیستم راهبری و… باشد. صفحه ای که باید در مواجهه با خطای ۵۰۰ نمایش داده شود شامل هیچ محتوای داینامیکی نیست، اگر دلیل خطای ۵۰۰ شکست اتصال دیتابیس باشد، اگر صفحه سفارشی خطا به master یا layoutpage که سعی دارند به دیتابیس وصل شوند متکی باشد، هرگز نمایش داده نخواهد شد.

اینجا مثالی از بخش های مرتبط در فایل web.config در اپلیکیشن وب فرم را داریم:

<system.webServer>
  <httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace">
    <remove statusCode="404" />
    <remove statusCode="500"/>
    <error statusCode="404" path="/NotFound.aspx" responseMode="ExecuteURL"/>
    <error statusCode="500" path="/Error.aspx" responseMode="ExecuteURL"/>
  </httpErrors>
</system.webServer>

مقدار errorMode مشخص می کند که صفحه سفارشی به کاربر راه دور نمایش داده خواهد شد، اما صفحه جزئیات خطا اگر کلاینت به صورت لوکال باشد نمایش داده می شود، به عنوان مثال در زمان توسعه اپلیکیشن. جایگزین رایجی که برای errorMode بسیار دیده می شود custom است، که نتایج در صفحه سفارشی همیشه نمایش داده می شوند. هر دو صفحه NotFound.aspx و Error.aspx در ریشه سایت قرار می گیرند.

مشکل این تنظیمات این است که به طور پیش فرض، یک کد وضعیت HTTP با عنوان ۲۰۰ (یافت شده) زمانی که صفحه سفارشی نمایش داده می شود، برگردانده می شود که از دید SEO هیچ استفاده ای ندارد. ممکن است که صفحه خطا در موتور جستجو ایندکس شود. ساده ترین راه این است که کد وضعیت صحیح را در رویداد Page_Load صفحه مرتبط بازنشانی کنیم.

public partial class NotFound : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 404;
    }
}
public partial class Error : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 500;
    }
}

فایل web.config برای MVC5 و نسخه های پایین تر تقریبا یکسان است:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404"/>
    <remove statusCode="500"/>
    <error statusCode="404" responseMode="ExecuteURL" path="/error/notfound"/>
    <error statusCode="500" responseMode="ExecuteURL" path="/error/error"/>
  </httpErrors>
</system.webServer>

در مثال ما، کنترلر با نام ErrorController داریم:

public class ErrorController : Controller
{
    public ActionResult Error()
    {
        Response.StatusCode = 500;
        return View();
    }

    public ViewResult NotFound()
    {
        Response.StatusCode = 404;
        return View();
    }
}

همان مشکل مربوط به کدهای وضعیت غیرمطلوب در سایت MVC هم اتفاق می افتد، بنابراین مقادیر صحیح را درست قبل از برگرداندن viewها تنظیم می کنیم.

خلاصه

در این مقاله، یاد گرفتیم که چگونه به موتورهای جستجو بگوییم که چه محتوایی از سایت ما را ایندکس کرده و چه قسمت هایی را نادیده بگیرند. نشان دادیم که چگونه یک نقشه سایت ایجاد کرده و در وب فرم و MVC نمایش دهیم و چگونه با استفاده از فایل robots.txt به موتور جستجو بگوییم که این نقشه سایت وجود دارد. سپس کدهای وضعیت HTTP مهمی که موتورهای جستجو به آن علاقه دارند پوشش دادیم و تاثیر آن ها بر آنچه ایندکس می شود را بررسی نمودیم. در نهایت، در این مقاله صفحات خطای سفارشی و نحوه ارسال کد وضعیت صحیح به کاربر را یاد گرفتیم.



avatar فاطمه زکایی

فاطمه زکایی هستم. فارغ التحصیل کارشناسی مهندسی نرم افزار، مدت سه سال هست که در زمینه توسعه اپلیکیشن های تحت وب و اندروید و همچنین تولید محتوای تخصصی برنامه نویسی تحت وب و اندروید در مجموعه mspsoft در خدمت شما هستم.

آخرین مطالب و تخفیفات در کانال تلگرام :) کانال تلگرام ام اس پی سافت
مطالب مرتبط
ديدگاه خود را ارسال کنيد


محبوب ترين ويدئو هاي انلاين
دوره برنامه نویسی فروشگاه اینترنتی
  • تعداد اعضا 80k
  • قيمت دوره۱۰۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره آموزشی سیستم ثبت سفارش آنلاین
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...
دوره طراحی سیستم مدیریت مشتریان
  • تعداد اعضا 80k
  • قيمت دوره۵۰,۰۰۰ تومان
  • امتيازدهي
    1 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 51 vote, average: 5٫00 out of 5( 5٫00 از 1 رای )
    Loading...