عنوان:

‫انتقال دائمی آدرس ها (Permanent Ridirect) در ASP.NET Webform


نویسنده: صابر فتح الهی
تاریخ: ۱۳۹۲/۰۹/۱۱ ۲۰:۱۰
آدرس: www.dntips.ir
یکی از مسائلی که همیشه برای وب سایت، از نظر موتور‌های جستجو بسیار مهم است، مقوله SEO Friendly بودن آدرس‌هاست. خوشبختانه در ASP.NET MVC این مقوله به خوبی پوشش داده شده است. برای مثال این قابلیت در ASP.NET Webforms توسط بسته نرم افزاری به نام ASP.NET FriendlyUrls توسط تیم توسعه دهنده ASP.NET ارائه شده است. در این زمینه قبلا آقای کاویانی در همین سایت در صفحه مروری بر قابلیت جدید ASP.NET FriendlyUrls  به این مقوله پرداخته‌اند و با مثال، نحوه‌ی استفاده از این بسته‌ی نرم افزاری را آموزش داده‌اند.
یکی از مسائلی که در ASP.NET Webforms با آن مواجه بودیم انتقال دائمی آدرس‌های صفحات یا همان Permanent Redirect بود.
در واقع زمانیکه شما در حالت عادی از بسته‌ی نرم افزاری مذکور استفاده می‌کنید، این افزونه باعث SEO Friendly شدن آدرس‌های صفحات شما می‌گردد. با در نظر گرفتن اینکه شما مطلب مروری بر قابلیت جدید ASP.NET FriendlyUrls  را مطالعه کرده اید، به فرض مثال کد زیر:
public static class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.EnableFriendlyUrls();
            routes.MapPageRoute("Sitemap", "sitemap.xml", "~/sitemap.aspx");
        }
    }
و رجیستر کردن آن در RouteTable سایت به صورت زیر در فایل Global
protected void Application_Start(object sender, EventArgs e)
{
     RouteConfig.RegisterRoutes(RouteTable.Routes);
}
باعث می‌شود که با زدن آدرس https://www.dntips.ir/sitemap.xml آدرس https://www.dntips.ir/sitemap.aspx لود شود؛ اما در نوار آدرس، همان آدرس sitemap.xml باقی خواهد ماند.
در این روش در صورتیکه کاربر آدرس https://www.dntips.ir/sitemap.aspx را در مرورگر خود تایپ کند باز هم سایت کار می‌کند (آدرس مورد نظر در دسترس است) و فاجعه زمانی شروع می‌شود که موتور جستجو، با محتوی تکراری در سایت در دو آدرس مختلف مواجه شود (پست آقای نصیری را در بهبود SEO در ASP.NET MVC  بررسی کنید) .
یا زمانیکه شما صفحات قدیمی دارید و می‌خواهید آنها را به آدرس‌های جدید منتقل کنید. برای رفع این مشکل طوری‌که هر زمان آدرس قدیمی هم وارد سیستم مسیریابی سایت شود به صورت اتوماتیک به آدرس جدید به صورت دائم منتقل شود، می‌توانید کد بالا را به صورت زیر اصلاح نمایید:
public static void RegisterRoutes(RouteCollection routes)
 {
            routes.EnableFriendlyUrls(new FriendlyUrlSettings()
            {
                AutoRedirectMode = RedirectMode.Permanent,
                ResolverCachingMode = ResolverCachingMode.Dynamic
            });
            routes.MapPageRoute("Sitemap", "sitemap.xml", "~/sitemap.aspx");
}
با این تنظیمات، سیستم مسیریابی ملزم به انتقال دائمی آدرس، به آدرس جدید خواهد شد. یعنی شما حتی اگر آدرس https://www.dntips.ir/sitemap.aspx را وارد نمایید مسیریاب سایت برای آدرس مورد نظر، وضعیت 301 Moved Permanently را مقدار دهی کرده و فقط آدرس https://www.dntips.ir/sitemap.xml به عنوان آدرس اصلی در نظر گرفته خواهد شد.

نظرات

  • مهمان در ۱۳۹۲/۰۹/۱۲ ۱۴:۱۸
    سلام
    ASP.NET FriendlyUrls چه تفاوتی با Routing  که در دات نت 4 به وب فرم اضافه شده دارد؟
    • صابر فتح الهی در ۱۳۹۲/۰۹/۱۲ ۱۵:۳۹
      از همون سیستم Routing دات نت استفاده می‌کنه با این تفاوت که کار باهاش راحتره،
  • مهمان در ۱۳۹۳/۰۵/۲۹ ۲۲:۴۱
    سلام؛ ممنون به خاطر مطلب مفیدی که قرار دادید. من این تنظیمات رو اعمال کردم  ولی بازم با درخواست هر دو آدرس ، صفحه بارگذاری میشه. در واقع باید هر دو آدرس رو اگر تایپ کردیم مشکلی پیش نیاد درسته؟ با asp.net webforms 4.5 کار میکنم.ممنون میشم بگید مشکل از چیه
    • صابر فتح الهی در ۱۳۹۳/۰۵/۳۱ ۱۴:۲۱
      لطفا نمونه کد خودتون بذارید بررسی کنم
      • محسن خان در ۱۳۹۳/۰۵/۳۱ ۱۸:۱۱
        در مثال پیوست شده زمانیکه sitemap معمولی فراخوانی میشه به sitemap.xml هدایت نمیشه (وضعیت 301 Moved Permanently در مرورگر قابل مشاهده نیست): FriendlyUrlsTests.zip
      • غلامرضا در ۱۳۹۳/۰۵/۳۱ ۲۰:۳۷
        ممنون به خاطر پاسختون . پس دقیقا به این صورت هستش که هر دو آدرس رو اگر درخواست کنیم صفحه مورد نظر نمایش داده میشه؟ ولی مسیر یاب گوگل این رو مسیر تکراری به حساب نمیاره؟ خطا رو نمایش نمیده پس؟
      • الی نادری در ۱۳۹۸/۰۱/۲۹ ۱۱:۱۷
        سلام؛ این کار رو انجام دادم ولی همچنان برای هر صفحه، دو آدرس دارم؛ یکی آدرس اصلی بدون پسوند aspx و یکی آدرسی که روت کردم. در واقع friendlyurls و routing هر کدام جدا کار خودشون رو انجام میدن .
        • وحید نصیری در ۱۳۹۸/۰۱/۲۹ ۱۲:۵۳
          مثال انتهای بحث «مروری بر قابلیت جدید ASP.NET FriendlyUrls» را اجرا کنید. بعد از اجرا، developer tools مرورگر را باز کرده و در برگه‌ی network آن، مراحل بارگذاری صفحه‌ی default.aspx را در صورت درخواست مستقیم آن بررسی کنید:

          زمانیکه برای بار اول آدرس default.aspx فراخوانی می‌شود، بلافاصله status مساوی 301 را دریافت می‌کنید که دقیقا معادل تنظیم AutoRedirectMode = RedirectMode.Permanent بحث جاری است. این مورد کل نکته‌ی مطلب جاری است.

          اگر موتور جستجویی، آدرس default.aspx را درخواست داد، بله، هنوز هم وجود دارد. اما درخواهد یافت که به صورت دائم به آدرس default/ منتقل شده و تنها همین آدرس را لحاظ خواهد کرد (به همین جهت به آن نکته‌ی «بهبود SEO» گفته می‌شود).

          • الی نادری در ۱۳۹۸/۰۱/۲۹ ۱۷:۱۴
            ممنون بابت پاسخگوییتون. ولی من میخوام ریدایرکت به آدرسی که روت کردم انجام بشه. مثلا من بعد از این تنظیمات: 
                        var settings = new FriendlyUrlSettings();
                        settings.AutoRedirectMode = RedirectMode.Permanent;
                        routes.EnableFriendlyUrls(settings);
            
                        routes.MapPageRoute("aboutus", "درباره-ما", "~/aboutus.aspx");
            انتظار دارم که صفحه "aboutus.aspx"  به  " درباره-ما "  ریدایرکت بشه نه به " aboutus " . آیا این کار شدنی هست یا نه؟ من بعد از این کار نتیجه ای که میگیرم این هست که برای یک صفحه دو آدرس دارم.  یکی " درباره-ما / mydomain " و دیگری "mydomain/ aboutus  " 
            • وحید نصیری در ۱۳۹۸/۰۱/۲۹ ۲۰:۳۱
              - هدف اصلی از EnableFriendlyUrls (که آخرین به روز رسانی آن مربوط به سال 2013 است) این است که به ازای تک‌تک صفحات aspx، کار تعریف MapPageRouteها را دستی انجام ندهید و گرنه نوشتن MapPageRoute مجزا، یعنی تعریف یک مسیریابی جدید.
              - برای تبدیل خودکار یک آدرس به آدرس دیگر، نیاز است مباحث IIS url rewrite را پیگیری کنید و یا از RouteMagic استفاده کنید که redirect از یک مسیریابی به مسیریابی دیگر را هم پشتیبانی می‌کند .