إعادة توجيه عناوين URL الخاصة بـ vBulletin إلى عناوين URL الخاصة بـ Discourse

هل تخطط للترحيل من vBulletin إلى Discourse وتريد إعادة توجيه عناوين URL القديمة من vBulletin إلى عناوين URL الجديدة في Discourse؟ تابع القراءة!

:bell: إذا كان عنوان URL الأساسي في المنتدى القديم والمنتدى الجديد هو نفسه، فيجب عليك اتباع هذا الدليل بدلاً من ذلك:

Redirect old forum URLs to new Discourse URLs using permalinks

في هذا الدليل، سنفترض ما يلي:

  • عنوان URL الأساسي لـ vBulletin: www.example.com/forum

  • عنوان URL الأساسي لـ Discourse: forum.example.com

  • خادم Nginx لـ www.example.com

لنبدأ!

إنشاء ملف خريطة Nginx

لإعداد إعادة توجيه الفئات والمواضيع، سنستخدم وحدة map في Nginx. سيتم إنشاء ملف CSV (script/import_scripts/vb_map.csv) أثناء تنفيذ عملية الاستيراد عبر دالة create_permalink_file. سنقوم بلصق محتوى ملف CSV في ملف الخريطة على الخادم.

محتويات عينة للملف:

...
/forum/forumdisplay.php?6  http://forum.example.com/c/games;
/forum/forumdisplay.php?7  http://forum.example.com/c/movies;
/forum/forumdisplay.php?13  http://forum.example.com/c/admin;
/forum/showthread.php?1  http://forum.example.com/t/x/22;
/forum/showthread.php?2  http://forum.example.com/t/x/23;
/forum/showthread.php?3  http://forum.example.com/t/x/24;
/forum/showthread.php?4  http://forum.example.com/t/x/25;
...

انسخ المحتوى الكامل لملف CSV المُنشأ إلى etc/nginx/vb_forum.map على خادم www.example.com.

تعديل nginx.conf

قم بتعديل ملف /etc/nginx/nginx.conf لإضافة هذا الكود في كتلة http:

map_hash_bucket_size 128;
map_hash_max_size 80000;

map $request_uri $new {
    include /etc/nginx/vb_forum.map;
}

server {
    listen 80;
    server_name www.example.com;

    location ~ ^/forum\\/showthread.php {
        if ($args ~* ^(\\d+)-(.+)$) {
            set $tid $1;
            set $args '';
            rewrite ^ /forum/showthread.php?$tid permanent;
        }
        if ($args ~* ^t=(\\d+)$) {
            set $tid $1;
            set $args '';
            rewrite ^ /forum/showthread.php?$tid permanent;
        }
        return 301 http://forum.example.com;
    }

    location ~ ^/forum\\/forumdisplay.php {
        if ($args ~* ^(\\d+)-(.+)$) {
            set $tid $1;
            set $args '';
            rewrite ^ /forum/forumdisplay.php?$tid permanent;
        }
        if ($args ~* ^f=(\\d+)$) {
            set $tid $1;
            set $args '';
            rewrite ^ /forum/forumdisplay.php?$tid permanent;
        }
        return 301 http://forum.example.com;
    }

    if ($new) {
        rewrite ^ $new permanent;
    }

    location /forum {
        return 301 http://forum.example.com;
    }
}

يجب ضبط map_hash_max_size بناءً على عدد عناوين URL الموجودة في ملف الخريطة.

التحقق من nginx.conf

تحقق من ملف إعدادات Nginx الخاص بك:

nginx -c /etc/nginx/nginx.conf -t

أعد تحميل إعدادات Nginx لتشمل التغييرات التي أجريتها:

sudo systemctl reload nginx

حاول الوصول إلى www.example.com/forum، ويجب أن يتم إعادة توجيهك الآن إلى forum.example.com. :tada:

سيتم التعامل مع أنواع عناوين URL التالية بواسطة إعدادات Nginx أعلاه:

  • www.example.com/forum –\u003e forum.example.com

  • www.example.com/forum/forumdisplay.php?6 –\u003e forum.example.com/c/games

  • www.example.com/forum/forumdisplay.php?6-Games –\u003e forum.example.com/c/games

  • www.example.com/forum/forumdisplay.php?f=6 –\u003e forum.example.com/c/games

  • www.example.com/forum/showthread.php?2 –\u003e forum.example.com/t/topic-slug/23

  • www.example.com/forum/showthread.php?2-topic-slug –\u003e forum.example.com/t/topic-slug/23

  • www.example.com/forum/showthread.php?t=2 –\u003e forum.example.com/t/topic-slug/23

9 إعجابات

Hi Arpit,

I have implemented your method and its working fine. But the problem is when I rebuild the app again all my nginx changes getting lost. please advise

Anil

The sample assumes that you’ll do the redirects on the old server, not the Discourse server.

If your discourse server is using the same name as your old server, you want to use permalink redirects, and perhaps permalink normalizations in discourse.

5 إعجابات

Thanks @pfaffman.
I used Permalink.create and solved the problem

3 إعجابات

For those who do not have MAP or can’t figure it out, I have figured out the easy (dumb) way to do it for topics at least. This works for VBulletin 4. I have not tested on 5 nor do a really want to deal with VBulletin ever again, so I probably won’t. I think the URL structure is the same though. This is for migrating from VBulletin 4 (hosted on NGINX) to Discourse (also hosted on NGINX).

*** Note, there are security implications with this process, but if you are new to NGINX (like I am) and just need to get this done and then figure out the fancy way later, this is what I did. In short, it requires you to keep your old vbulletin running for a while *****

  1. Change your VBulletin URLs to “Advanced Friendly URLs” >Admin>Settings>Options>Friendly URLS. This will get rid of the argument character “?” in all your urls. All the destination posts will be at “…showthread.php/(the-post-id-number)-blablablabla…” Old urls with google juice will forward to the new urls. Don’t worry.

  2. Now import your vbulletin and make sure that you uncomment the permalinks section (as described in this thread).

  3. After import, open the vb_map.csv. You will see post to post (ID to ID) maps like xxxx837 yyyy589. The first is the ID of the VB thread and second is the ID of the Discourse thread.

The VB thread is at http://myamazinglyoldforum.com/showthread.php/837- and the new discourse one is at https://myawesomenewforum.com/t/589

  1. You can probably guess what to do now. Just create a rewrite in your site-available file (above your root delineation).

Using the example above:

rewrite /showthread.php/837- https://myawesomenewforum.com/t/589 permanent;

  1. The “-” is key in this whole equation so remember to put it in there. A simple txt editor with “find-replace” will convert the map file to nginx rewrite directives.

Nginx seems to be able to handle several thousand rewrites (or several hundred thousand as the case may be). I have seen no performance issues so far.

best,
Walker

3 إعجابات

Just a note on all of this. I did finally get rid of the VB forum (for security reasons).

To redirect the showthread.php?bla- to /showthread.php/bla- in nginx instead of with VB’s own PHP you do this (above your re-write rule list)

(in my case, the old forum lives at “tech” but you will change this to be whatever folder it lives at)

location ~ ^/tech(?:/(.*))?$ {
  rewrite ^/tech/showthread.php /tech/showthread.php/$args permanent;
  rewrite ^/tech/content.php /tech/content.php/$args permanent;
}

then all the redirect rules live below here:

rewrite /showthread.php/837- https://myawesomenewforum.com/t/589 permanent;

On a further note, it took me FOREVER to figure out how to simply replace a question mark with a forward slash in NGINX. Maybe I’m dumb (no I’m certainly dumb), but the above little snippet works like a charm and I don’t see it widely documented elsewhere.

edit> Thanks for the formatting.

5 إعجابات