الـ mod_rewrite ، اسم مر عليكم من قبل، أليس كذلك؟

بكل بساطة ، هي أداة للتلاعب في العناوين URLs ، وتعمل عبر إضافة mod_rewrite إلى الخادم أباتشي -apache- ، ولها قواعدها وطرق كتابتها ، وهي تستخدم في نفس الوقت العبارات المنتظمة regular-expression ، كما أن هذه القواعد والشروط يمكن للمستخدم كتابتها في موقعه خاص عبر إدراجها في ملفات .htaccess ، أو عبر مدير الخادم في الملف الرئيسي httpd.conf.
طبعاًً هي متوسعة جداً ، ولا يمكن حصرها في مقال واحد ، لذا سأكتفي في هذا المقال بشرح الفكرة الأساسية والقواعد الرئيسية أو المعتادة الاستعمال، وننتهي بعد ذلك بتطبيق مثال بسيط.

لا أنسى إن أردنا ذكر تاريخ إضافة الاباتشي (أقصد الـ mod_rewrite ) فهي كانت من ابتكار Ralf S. Engelschall في عام 1996م ثم قدمها كـ هدية إلى مجموعة أباتشي في
عام 1997م

الآن لنبدأ العمل !

لنبدأ بفتح ملف .htaccess ، ولنرى ماذا يجب أن نكتب (اعلم أن بعض برامج الـ FTP لا تظهر لك أي ملف يبدأ بالنقطة لذلك عليك تفعيل ذلك في البرنامج أو استخدام إدارة الملفات عبر لوحة تحكم الموقع) - ( انتبه : فالنقطة في اسم الملف .htaccess هي في بداية الملف وليس نهايته )

CODE:
  1. RewriteEngine on

ماذا يعني ما سبق؟
هذه العبارة الأولى التي يجب أن تتعلمها ، وهي تخبر الخادم انه عليه تفعيل محرك الـ rewriting ، لكن لماذا؟
لأنها في الواقع مغلقة بشكل افتراضي ويجب أن يتم تفعيلها في كل ملف تريد أن تصدر مثل هذه الأوامر ، وأحب أن انوه إلى أن بعض الخوادم تعطل هذه الميزة بشكل كلّي ، أي أنه حتى مع استخدامك للعبارة السابقة فلن يعمل المحرك.

CODE:
  1. RewriteOptions inherit| MaxRedirects=number

امممم ، المقصود من العبارة RewriteOptions هي تحديد خيارات معينة وهي تحتمل قيمتين مذكورتين بالأعلى:
1- Inherit : وتعني وراثة الخصائص ، أي إذا وضع ملف الـ .htaccess في مجلد فرعي ، بهذا الخيار سوف يتم وراثة أي خصائص لملفات .htaccess كانت موجودة في المجلد الأب، وتصبح كتابة العبارة بالشكل التالي:

CODE:
  1. RewriteOptions inherit

الاحتمال الثاني هو:
MaxRedirects=number : وهي تعني عدد مرات إعادة التوجيه ، وافتراضياً هي 10 ، ومن غير المعتاد أن تكون أكثر من ذلك إلا إن أحببت ، وبالطبع لتغيير ذلك يتم وضع الرقم بدل العبارة number فتصبح بالشكل النهائي:

CODE:
  1. RewriteOptions MaxRedirects= 15

العبارة الثالثة:
إذا كان لدينا مسار قديم يحمل الشكل التالي:

CODE:
  1. dir1/dir2/almashroo1.html

وكنّا نريد التلاعب بالروابط بحيث نوجد روابط بديلة مختصرة لهذه العملية، ولنفترض أننا نريد أي شخص يأتي من الرابط على الشكل التالي :

CODE:
  1. dir/almashroo1.html

بكل بساطة أولاً يجب علينا استخدام العبارة التالية:

CODE:
  1. RewriteBase URL-path

وهي تعني تحديد المجلد الأساسي الذي سوف يتم التحويل منه، أي إذا كتبنا:

CODE:
  1. RewriteBase /dir

في هذه الحالة أي ملفات تأتي تحت المجلد dir سوف يتم معالجتها حسب الأسطر القادمة.

العبارة الرابعة:

CODE:
  1. RewriteRule Pattern Substitution

العبارة هي RewriteRule ، وتعود فائدتها حيث أنها تحتوي على الرابط الأصلي الذي سوف يتم فتحه للمستخدم دون ظهور رابطه لأي سبب كان.

CODE:
  1. RewriteRule ^almashroo1.html$ almashroo2.html

هذه العبارة هي العبارة الأهم في الـ mod_rewrite لأنها هي التي تحتوي على الروابط الأصلية والروابط المتلاعب بها.

أولاًً : ما بين الـ ^ و $ هي العبارة التنكرية التي سوف يستخدمها المستخدم في المتصفح.

ثانياًً : الجملة الثالثة الغير محاطة بشيء وهي في مثالنا almashroo2.html فهي
العبارة التي سوف يتم إعادة توجيه المستخدم لها عند طلب العبارة التنكرية.
مممم ، لنقم الآن بتجربة مثال بسيط لذلك.
افتح ملف الـ .htaccess واكتب فيه:

CODE:
  1. RewriteEngine on
  2. RewriteBase /dir1/dir/2
  3. RewriteRule ^almashroo1.html$ almashroo2.html

وقم بحفظ الملف في المجلد

CODE:
  1. /dir

الآن أي طلب من موقعك على الشكل

CODE:
  1. http://www.domain.com/dir/almashroo1.html

سوف يتحول لكن دون أي يظهر التحول للمستخدم إلى العنوان:

CODE:
  1. http://www.domain.com/dir1/dir2/almashroo2.html

نستنتج من السابق ، أننا يجب أن نضع ملف الـ .htaccess في المجلد التنكري.

لكن ماذا إذا كنت افترضت أن يكون لديّ العديد من المجلدات التنكرية؟ هل يجب أن أضع ملف.htaccess في العديد من المجلدات؟
بالطبع لا ، حيث يمكنك وضع الـ .htaccess في المجلد الرئيسي بالمحتوى التالي:

CODE:
  1. RewriteEngine on
  2. RewriteBase /dir1/dir/2
  3. RewriteRule ^dir/almashroo1.html$ almashroo2.html

سوف يصبح أي دخول للمسار dir/almashroo1.html يتحول مباشرة إلى الملف almashroo2.html الموجود داخل المسار /dir1/dir/2 .

كما أحب أن أنوه إلى أنه يمكن اختصار RewriteBase بدمجه بالعبارة أسفل منه، لكن هو في الأصل مفيد في حالة كان هناك لديك الكثير من الـ RewriteRule وكلها تقع في نفس المجلد فهي تختصر الوقت والجهد.

من الأشياء المهمة في العبارة RewriteRule أنها تتقبل المتغيرات بشكل عبارات منتظمة.

اعتقد أننا نحتاج مقالة أخرى، نراكم في الجزء الثاني بإذن الله : ).