مشكلة في الروابط الدائمة بعد الترحيل

مرحباً،

تمكنت بنجاح من نقل برنامج منتدى قديم كتبته بنفسي إلى منصة Discourse.
بعد استيراد 2 مليون سجل على مدار 24 ساعة، يعمل كل شيء بشكل ممتاز باستثناء الروابط الدائمة (Permalinks).

لدي حوالي 350,000 رابط دائم في جدول قاعدة البيانات المخصص للروابط الدائمة في Discourse. جميعها مكتوبة بحروف صغيرة، مثل: “forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html”.

للأسف، تقوم جوجل بالربط إلى “/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/”، مما يؤدي إلى ظهور رسالة خطأ 404. :frowning:

هل لديك أي اقتراحات حول كيفية تحويل عنوان URL المطلوب إلى حروف صغيرة قبل البحث عنه في جدول الروابط الدائمة، دون التأثير على أي شيء آخر؟ ألا ينبغي أن يكون هذا النوع من التحويل قبل البحث إجراءً قياسياً؟

شكراً لكم على هذا البرنامج الرائع!

غوكس

مرحبًا! تهانينا على وصولك إلى هنا!

أعتقد أنك ترغب في إنشاء تطبيع للرابط الدائم يتجاهل الجزء التعريفي (slug) وينشئ روابط دائمة تحتوي فقط على معرف المنتدى.

أليس ما نحتاجه لتحديد الموضوع الصحيح هو t140842-s1؟

هناك بعض أدوات الاستيراد الأخرى التي تفعل ذلك، رغم أنني لست متأكدًا من أي منها. ربما vBulletin؟ ولكن إذا بحثت في جميعها عن التطبيع باستخدام grep، فستجد مثالًا.

شكرًا لك على الرد السريع.

لم أكن أعرف قبل الترحيل أن عملية البحث حساسة لحالة الأحرف — وإلا لكانت حاولت مراعاة ذلك والتأكد من حفظ الرابط بالطريقة التي كانت عليها في البرنامج القديم.

لكنني الآن بعد الترحيل، والموقع يعمل بشكل فعلي. لذا، للأسف، أنا أبحث عن طرق للتغلب على هذه المشكلة.

يمكنني تحديد موضوع من خلال معرفه (ID)، لذا فإن “/forum/t140842” سيكون كافيًا. عبر SQL، يمكنني تعديل حقل url في جدول الروابط الدائمة بهذه الطريقة، لكن هل سيؤدي ذلك إلى البحث وإعادة التوجيه؟ لقد أجريت اختبارًا سريعًا ولم ينجح.

هناك خيار لتطبيع الروابط الدائمة في إعدادات discourse — لكنني لم أفهم ما الذي يفعله بالضبط.

سيؤدي تطبيع الرابط الدائم إلى إعادة كتابة الرابط قبل مطابقته للرابط الدائم، مما يتيح لك استخدامه لإزالة الجزء المميز من الرابط. يشرح وصف هذه الميزة في الإعدادات كيفية عملها، لكن ربما فقط إذا كنت تفهمها بالفعل. :man_shrugging:

يجب أن تكون معرفات المواضيع القديمة موجودة في topicCustomField، لذا يجب أن تتمكن من إنشاء روابط دائمة جديدة من خلال التكرار عبر تلك القيم. ثم احذف الروابط القديمة. (أو احذفها جميعًا بمجرد التأكد من قدرتك على إنشاء الروابط التي تريدها).

يمكنك البحث هنا وفي أدوات الاستيراد الأخرى عن مصطلحي “الرابط الدائم” و"التطبيع" للعثور على بعض الأمثلة (grep -r إحدى الطرق). إذا احتجت إلى مزيد من المساعدة ولديك ميزانية، يمكنني مساعدتك الأسبوع المقبل.

حسناً، لدي هذا الطلب

https://a3-freunde.de/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor

وإحدى عمليات تطبيع الروابط الدائمة في الإعدادات مثل

/t(\d*)/?$forum/t\1

والتي يجب أن تؤدي إلى “forum/t140842” للطلب المذكور أعلاه.

عند إضافة عنوان URL “forum/t140842” إلى جدول الروابط الدائمة في discourse، لا يظهر أي تأثير؟
هل افتراضاتي صحيحة؟ ما الذي أغفلته؟

أنت على المسار الصحيح. إن التعامل مع تعبيرات النمط المنتظم قد يكون دقيقًا. أعتقد أنك تحتاج إلى forum/ في بداية الرابط الدائم الخاص بك.

شكرًا على الجهد. أقدر ذلك.

في الإعدادات، غيّرت تعبير النمط الخاص بي إلى (أقصد أن تعبير النمط الخاص بي يجب أن يطابق معرف الموضوع أيضًا)

forum/t(\d*)/?$forum/t\1

عندما أضيف رابطًا دائمًا جديدًا إلى الجدول بعنوان URL “forum/t140842” وأحفظه… يقوم Discourse بتغيير الرابط إلى “f?$forum/t140842”. إما أن هناك خللًا أو أنني لا أفهم المفهوم هنا.

:confused:

بعد محاولة المزيد من تطبيع التعبير النمطي (regex)، لم أتمكن من فهم كيفية عمل ذلك. أدى استخدام المثال المذكور في الوصف مرة أخرى إلى نتائج غير متوقعة في حقل الرابط عند إضافة روابط دائمة جديدة.

عندما قمت بالانتقال إلى منصة Discourse، قمت بإزالة بادئة www من النطاق. منحني هذا الآن الفرصة لإعادة كتابة URI على الخادم القديم عبر إعدادات Apache وملف .htaccess لتحويلها إلى أحرف صغيرة قبل إعادة التوجيه إلى خادم Discourse الجديد. هذا النوع من الحلول حل مشكلتي إلى حد ما في الوقت الحالي.

لم يعمل كما هو متوقع لأن جزء الرابط (slug) في URL تم إنشاؤه في سكريبت الهجرة بشكل مختلف قليلاً عما كان عليه في البرنامج القديم.

لذلك قمت بـ “تطبيع” الرابط بنفسي.

إضافة/إنشاء روابط موحدة (جدول روابط دائمة في Discourse)

في حقل URL، قم بتحويل

forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

أو
forum/t140842-s2/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

أو
forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

إلى رابط بسيط يحتوي فقط على معرف الموضوع القديم:
forum/t140842

يتم ذلك عبر أمر SQL يعيد كتابة الرابط باستخدام دالة REGEXP_REPLACE:

INSERT INTO permalinks (created_at, updated_at, topic_id, url) SELECT NOW(), NOW(), topic_id, REGEXP_REPLACE(url,'forum/t(\d*)(-?.*)/(.*)','forum/t\1','') url FROM permalinks WHERE topic_id > 0 ON CONFLICT DO NOTHING;

إعادة كتابة الطلبات القديمة عبر .htaccess على النطاق القديم

RewriteRule ^forum/t([0-9]*)(-?.*)/(.*)$ https://discourse-domain.com/forum/t$1 [R=301,L]

ماذا يحدث هنا؟

قامت جوجل بفهرسة الرابط https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html وربطت به. كنت محظوظًا لأن هذا الطلب انتهى على خادم Apache بسبب اختلاف النطاق، مما سمح لي باستخدام ملف .htaccess لإعادة الكتابة بسهولة. لذا قمت بإعادة توجيه هذا الطلب إلى https://discourse-domain.com/forum/t140842. في جدول الروابط الدائمة (permalinks)، أضفت سجل forum/t140842 هذا باستخدام الرابط الدائم المضاف مسبقًا الذي يحتوي على الرابط الكامل مع الجزء المخصص (slug) باستخدام تعبير نمطي (انظر أعلاه).

آمل أن يساعد هذا شخصًا آخر كنقطة انطلاق.