سؤال

لقد قمت مؤخرًا بترحيل موقع ويب إلى نظام إدارة محتوى جديد (Umbraco).لقد تغيرت الكثير من الروابط، ولكن يمكن تصحيحها بسهولة من خلال البحث عن الأنماط في عنوان url، لذلك أود أن أكتب شيئًا يعيد التوجيه إلى الصفحة الصحيحة إذا لم يتم العثور على الصفحة القديمة.هذا الجزء ليس مشكلة.

كيف يمكنني الحصول على عنوان URL المطلوب بعد إعادة توجيه المتصفح إلى صفحة 404 المخصصة الخاصة بي.حاولت استخدام:

request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.

لكن هذا لم ينجح.

أيه أفكار؟

الموقع على IIS 6.0.لقد فكرنا في استخدام عمليات إعادة التوجيه 301، ولكن ليس لدينا أي طريقة لمعرفة الصفحات التي قام الأشخاص بوضع إشارة مرجعية عليها وهناك بضع مئات من الصفحات، لذلك لا أحد حريص على قضاء الوقت في إنشاء عمليات إعادة التوجيه 301.

هل كانت مفيدة؟

المحلول

أفعل نفس الشيء الذي تطلبه في صفحة معالجة الأخطاء 404 المخصصة.في IIS 6، يكون عنوان URL الأصلي موجودًا في سلسلة الاستعلام.يوضح الكود أدناه كيفية الحصول على عنوان URL الأصلي ثم إعادة توجيه المستخدم.في حالتي، قمت بالتبديل من ASP القديم إلى ASP.NET الجديد، لذلك كان لا بد من إعادة توجيه كافة صفحات .asp إلى صفحات .aspx.كما تم تغيير بعض عناوين URL لذلك أبحث عن الكلمات الرئيسية في عنوان URL القديم وأعيد توجيهه.

//did the error go to a .ASP page?  If so, append x (for .aspx) and 
//issue a 301 permanently moved
//when we get an error, the querystring will be "404;<complete original URL>"
string targetPage = Request.RawUrl.Substring(Request.FilePath.Length);

if((null == targetPage) || (targetPage.Length == 0))
    targetPage = "[home page]";
else
{
     //find the original URL
    if(targetPage[0] == '?')
    {
        if(-1 != targetPage.IndexOf("?aspxerrorpath="))
             targetPage = targetPage.Substring(15); // ?aspxerrorpath=
        else
             targetPage = targetPage.Substring(5); // ?404;
        }
        else
        {
             if(-1 != targetPage.IndexOf("errorpath="))
             targetPage = targetPage.Substring(14); // aspxerrorpath=
             else
            targetPage = targetPage.Substring(4); // 404;
        }
    }               

    string upperTarget = targetPage.ToUpper();
    if((-1 == upperTarget.IndexOf(".ASPX")) && (-1 != upperTarget.IndexOf(".ASP")))
    {
        //this is a request for an .ASP page - permanently redirect to .aspx
        targetPage = upperTarget.Replace(".ASP", ".ASPX");
        //issue 301 redirect
        Response.Status = "301 Moved Permanently"; 
        Response.AddHeader("Location",targetPage);
        Response.End();
    }

    if(-1 != upperTarget.IndexOf("ORDER"))
    {
                //going to old order page -- forward to new page
               Response.Redirect(WebRoot + "/order.aspx");
           Response.End();
    }

نصائح أخرى

ماذا عن:

Request.ServerVariables("HTTP_REFERER");

لقد تغيرت الكثير من الروابط، ولكن يمكن تصحيحها بسهولة من خلال البحث عن الأنماط في عنوان URL

بدلاً من إرسال المستخدمين لديك إلى 404، هل فكرت في استخدام إعادة كتابة عنوان URL؟بهذه الطريقة سيحصل المستخدمون (ومحركات البحث، إذا كان ذلك مهمًا بالنسبة لك في هذه الحالة) على 301 أو 302 بدلاً من الاضطرار إلى المرور عبر معالج 404 الخاص بك.عادةً ما يكون التعامل مع إعادة الكتابة على مستوى عنوان URL أسرع وأقل إرهاقًا على خوادمك من تشغيل التعليمات البرمجية الخاصة بك ومعالجتها هناك.

أصدرت شركة مايكروسوفت أ وحدة إعادة كتابة عنوان URL لـ IIS 7, ، وهناك مقدمة لائقة لها هنا و هنا.

بالنسبة لـ IIS 6، هناك مقدمة جيدة هنا للحصول على إعادة كتابة عنوان URL للعمل معه، يختلف قليلاً عن IIS7.

مثال على قاعدة إعادة الكتابة سيكون

# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1 

هناك بضع مئات من الصفحات، لذلك لا أحد حريص على قضاء الوقت في إنشاء صفحات 301

يكمن جمال قواعد إعادة الكتابة في أنك لا تحتاج إلى القائمة لإدراج جميع صفحاتك بشكل صريح، ولكن يمكنك كتابة القواعد التي تتبع نفس النمط.لقد كان علينا أن نفعل شيئًا مشابهًا لهذا مؤخرًا، ومن المدهش عدد عناوين URL المنقولة التي يمكن التعامل معها من خلال بضع قواعد بسيطة.

بدلاً من استخدام صفحة 404، أعتقد أن الشيء الصحيح الذي يجب فعله هو إعادة التوجيه باستخدام ملف 301 منقول بشكل دائم شفرة.

إليك ما نفعله في init على صفحاتنا الـ 404:

Dim AttemptedUrl As String = Request.QueryString("aspxerrorpath")
If Len(AttemptedUrl) = 0 Then AttemptedUrl = Request.Url.Query
AttemptedUrl = LCase(AttemptedUrl)
CheckForRedirects(AttemptedUrl)

لدى CheckforRedirects بعد ذلك منطق مخصص لمطابقة عناوين URL القديمة مع عناوين URL الجديدة.

أنا أزعم أن هذا هو الأسلوب المفضل (على عكس 301 أو إعادة كتابة عنوان URL) إذا كان لديك معلومات كافية داخليًا لمطابقة عدد كبير من عناوين URL من النظام القديم مع النظام الجديد - على سبيل المثال.إذا كان لديك جدول يطابق المعرفات القديمة بالمعرفات الجديدة أو شيء مشابه.

إذا كان هناك نمط ثابت يمكنك استخدامه لتعيين عناوين URL القديمة إلى عناوين URL الجديدة باستخدام التعبير العادي، فإن إعادة كتابة عنوان URL ستكون هي الطريقة الصحيحة.

للبناء على اقتراح إعادة الكتابة، تستخدم Umbraco بالفعل UrlRewriting.NET ويمكن إضافة عمليات إعادة كتابة جديدة إلى

\config\UrlRewriting.config

أتمنى أن يساعدك هذا

تحديث، أنت في الواقع تريد التقاط:

فب.نت:

Request.QueryString("aspxerrorpath")

ج#:

Request.QueryString["aspxerrorpath"];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top