מאמרים ביצוע הפניית 301 מ: Default.aspx לתיקיית השורש

danielkatz

משתמש צעיר
D I G I T A L
בבניית אתר ידידותי למנועי החיפוש אנו נתקלים לא אחת באתגרים משונים. מסיבות היסטוריות תשתיות של ASP.NET (ובמיוחד הגרסאות הקודמות ל4.0) לא עוזרות לנו בתחום הSEO. להפך, לפעמים אנו נאלצים להלחם מעט כדי להשלים משימות טריוואליות לכאורה.
בשרתי IIS, כשגולש מבקש, לדוגמה, את הכתובת /http://domain.com ("כתובת השורש") הוא יקבל את את התוכן של הכתובת http://domain.com/default.aspx ("דף הבית").
איך זה קורה? האחראית על זה היא רשימה בשם "Default Document" של הIIS שקובעת את דף ברירת המחדל שיוחזר במקרה שהגולש ביקש את כתובת השורש של האתר.

התוצאה היא די בעייתית מבחינת SEO. יוצא שאותו התוכן זמין בשתי כתובות: ב /http://domain.com וב http://domain.com/default.aspx. במונחים של SEO זה נקרא כפילות תוכן, ונחשו מה? - זה רע.

בגדול, הפתרון הוא פשוט מאוד: באירוע BeginRequest לבדוק האם הUrl שאליו המשתמש גלש הוא http://domain.com/default.aspx ואם כן לבצע הפניית 301 לכתובת השורש.
מה שהופך את החיים למסובכים הוא, כשאתם מריצים את האפליקציה בשרת הפיתוח של Visual Studio (הנקרא cassini), אם תבדקו את הערך של Request.Url הוא יהיה 'http://domain.com/default.aspx'. גם, אם בפועל ביקשתם את 'http://domain.com'! וגם אם תבדקו את הערך של Request.RawUrl תראו רק '?http://domain.com/default.aspx'...
נמצא שלא ניתן לדעת האם בפועל הגולש גלש לכתובת השרש או לדף הראשי.
הסוד הוא, שהבעיה קיימת רק בשרת cassini! כלומר כשתעלו את האפליקציה לאחסון על שרת IIS תוכלו לבדוק את הכתובת המדויקת אותה ביקש הגולש דרך Request.RawUrl.
ומכאן הדרך קצרה:
תוסיפו בGlobal.asax מטפל עבור האירוע BeginRequest, ותעשו הפנייה על בסיס הערך של Request.RawUrl.

קוד:
<%@ Application Language="C#" %>
<script RunAt="server">

    void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.RawUrl.StartsWith("/default.aspx", StringComparison.InvariantCultureIgnoreCase))
        {
            Response.RedirectPermanent("~/", true);
        }
    }
       
</script>

בדוגמה השתמשתי במתודה HttpResponse.RedirectPermanent שהיא מתודה חדשה בASP.NET 4.0 שמבצעת הפנית 301.

בASP.NET 3.5 תוכלו לכתוב כך:

קוד:
<%@ Application Language="C#" %>
<script RunAt="server">

    void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.RawUrl.StartsWith("/default.aspx", StringComparison.InvariantCultureIgnoreCase))
        {
            Response.Clear();
            Response.StatusCode = 301;
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location", Response.ApplyAppPathModifier("~/"));
            Response.End();
        }
    }
       
</script>
 

wmw

משתמש פעיל
D I G I T A L
הקוד הראשון [ל.NET4] לא תמיד יבצע הפניית 301.
זה תלוי בקונפיגורציה של IIS
וייתכן שכאשר תחליף שרת איחסון, תמצא שהוא מבצע את ההפניה דווקא באמצעות HEADER של 302.
[שהמומחים טוענים שגוגל מתייחסת אליו כפשוטו ...]
ולפעמים הוא יכול בכלל "לעשות את ההפניה בעצמו" דהיינו להחזיר HEADER שהדפדפן יתייחס אליו כרצונו.
לכן לדעתי תמיד כדאי להוסיף את השורות:
Response.StatusCode = 301;
Response.Status = "301 Moved Permanently";
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קיט ב'

ט בַּמֶּה יְזַכֶּה נַּעַר אֶת אָרְחוֹ לִשְׁמֹר כִּדְבָרֶךָ:י בְּכָל לִבִּי דְרַשְׁתִּיךָ אַל תַּשְׁגֵּנִי מִמִּצְוֹתֶיךָ:יא בְּלִבִּי צָפַנְתִּי אִמְרָתֶךָ לְמַעַן לֹא אֶחֱטָא לָךְ:יב בָּרוּךְ אַתָּה יְהוָה לַמְּדֵנִי חֻקֶּיךָ:יג בִּשְׂפָתַי סִפַּרְתִּי כֹּל מִשְׁפְּטֵי פִיךָ:יד בְּדֶרֶךְ עֵדְוֹתֶיךָ שַׂשְׂתִּי כְּעַל כָּל הוֹן:טו בְּפִקֻּדֶיךָ אָשִׂיחָה וְאַבִּיטָה אֹרְחֹתֶיךָ:טז בְּחֻקֹּתֶיךָ אֶשְׁתַּעֲשָׁע לֹא אֶשְׁכַּח דְּבָרֶךָ:
נקרא  16  פעמים

לוח מודעות

למעלה