[mod_rewrite] تفاصيل أكثر
مدرج تحت قسم: دروس
بكل بساطة، هي أداة للتلاعب في العناوين URLs، وتعمل عبر إضافة mod_rewrite إلى الخادم أباتشي Apache، ولها قواعدها وطرق كتابتها، وهي تستخدم في نفس الوقت العبارات المنتظمة regular expression، كما أن هذه القواعد والشروط يمكن للمستخدم كتابتها في موقعه خاص عبر إدراجها في ملفات .htaccess، أو عبر مدير الخادم في الملف الرئيسي httpd.conf.
طبعاًً هي متوسعة جداً، ولا يمكن حصرها في مقال واحد، لذا سأكتفي في هذا المقال بشرح الفكرة الأساسية والقواعد الرئيسية أو المعتادة الاستعمال، وننتهي بعد ذلك بتطبيق مثال بسيط.
لا أنسى إن أردنا ذكر تاريخ إضافة الاباتشي (أقصد mod_rewrite ) فهي كانت من ابتكار Ralf S. Engelschall في عام 1996م ثم قدمها كهدية إلى مجموعة أباتشي في عام 1997م
الآن لنبدأ العمل
لنبدأ بفتح ملف .htaccess ، ولنرى ماذا يجب أن نكتب، اعلم أن بعض برامج الـ FTP لا تظهر لك أي ملف يبدأ بالنقطة لذلك عليك تفعيل ذلك في البرنامج أو استخدام إدارة الملفات عبر لوحة تحكم الموقع.
انتبه : فالنقطة في اسم الملف .htaccess هي في بداية الملف وليس نهايته.
RewriteEngine on
ماذا يعني ما سبق؟
هذه العبارة الأولى التي يجب أن تتعلمها، وهي تخبر الخادم انه عليه تفعيل محرك الـ rewriting، لكن لماذا؟
لأنها في الواقع مغلقة بشكل افتراضي ويجب أن يتم تفعيلها في كل ملف تريد أن تصدر مثل هذه الأوامر، وأحب أن انوه إلى أن بعض الخوادم تعطل هذه الميزة بشكل كلّي، أي أنه حتى مع استخدامك للعبارة السابقة فلن يعمل المحرك.
RewriteOptions inherit| MaxRedirects=number
المقصود من العبارة RewriteOptions هي تحديد خيارات معينة وهي تحتمل قيمتين مذكورتين بالأعلى:
1- Inherit : وتعني وراثة الخصائص ، أي إذا وضع ملف .htaccess في مجلد فرعي، بهذا الخيار سوف يتم وراثة أي خصائص لملفات .htaccess كانت موجودة في المجلد الأب، وتصبح كتابة العبارة بالشكل التالي:
RewriteOptions inherit
2- MaxRedirects=number : وهي تعني عدد مرات إعادة التوجيه ، وافتراضياً هي 10 ، ومن غير المعتاد أن تكون أكثر من ذلك إلا إن أحببت ، وبالطبع لتغيير ذلك يتم وضع الرقم بدل العبارة number فتصبح بالشكل النهائي:
RewriteOptions MaxRedirects= 15
العبارة الثالثة
إذا كان لدينا مسار قديم يحمل الشكل التالي:
dir1/dir2/almashroo1.html
وكنّا نريد التلاعب بالروابط بحيث نوجد روابط بديلة مختصرة لهذه العملية، ولنفترض أننا نريد أي شخص يأتي من الرابط على الشكل التالي:
dir/almashroo1.html
بكل بساطة أولاً يجب علينا استخدام العبارة التالية:
RewriteBase URL-path
وهي تعني تحديد المجلد الأساسي الذي سوف يتم التحويل منه، أي إذا كتبنا:
RewriteBase /dir
في هذه الحالة أي ملفات تأتي تحت المجلد dir سوف يتم معالجتها حسب الأسطر القادمة.
العبارة الرابعة:
RewriteRule Pattern Substitution
العبارة هي RewriteRule، وتعود فائدتها حيث أنها تحتوي على الرابط الأصلي الذي سوف يتم فتحه للمستخدم دون ظهور رابطه لأي سبب كان.
RewriteRule ^almashroo1.html$ almashroo2.html
هذه العبارة هي العبارة الأهم في mod_rewrite لأنها هي التي تحتوي على الروابط الأصلية والروابط المتلاعب بها.
أولاًً : ما بين الـ ^ و $ هي العبارة التنكرية التي سوف يستخدمها المستخدم في المتصفح.
ثانياًً : الجملة الثالثة الغير محاطة بشيء وهي في مثالنا almashroo2.html فهي العبارة التي سوف يتم إعادة توجيه المستخدم لها عند طلب العبارة التنكرية.
لنقم الآن بتجربة مثال بسيط لذلك.
افتح ملف الـ .htaccess واكتب فيه:
RewriteEngine on RewriteBase /dir1/dir/2 RewriteRule ^almashroo1.html$ almashroo2.html
وقم بحفظ الملف في المجلد.
/dir
الآن أي طلب من موقعك على الشكل:
http://www.domain.com/dir/almashroo1.html
سوف يتحول لكن دون أي يظهر التحول للمستخدم إلى العنوان:
http://www.domain.com/dir1/dir2/almashroo2.html
نستنتج من السابق، أننا يجب أن نضع ملف الـ .htaccess في المجلد التنكري.
لكن ماذا إذا كنت افترضت أن يكون لديك العديد من المجلدات التنكرية؟ هل يجب أن تضع ملف.htaccess في العديد من المجلدات؟
بالطبع لا، حيث يمكنك وضع .htaccess في المجلد الرئيسي بالمحتوى التالي:
RewriteEngine on RewriteBase /dir1/dir/2 RewriteRule ^dir/almashroo1.html$ almashroo2.html
سوف يصبح أي دخول للمسار dir/almashroo1.html يتحول مباشرة إلى الملف almashroo2.html الموجود داخل المسار /dir1/dir/2.
كما أحب أن أنوه إلى أنه يمكن اختصار RewriteBase بدمجه بالعبارة أسفل منه، لكن هو في الأصل مفيد في حالة كان هناك لديك الكثير من RewriteRule وكلها تقع في نفس المجلد فهي تختصر الوقت والجهد.
من الأشياء المهمة في العبارة RewriteRule أنها تتقبل المتغيرات بشكل عبارات منتظمة.


بارك الله فيك أخي ( أبو خالد ) .. إستمر
وأنتظر الجزء الثاني أحر من الجمر ..
ولك خالص حبي وتقديري
جهد تشكر عليه ..
و نحن بانتظار باقي الأجزاء بارك الله فيك ،،
بارك الله فيك
لدي موقع ما واريد ان اغير روباطبه
هذا الرابط القديم
http://www.12345.com/dir1/namefile.php?action=category&id=2
اريد ان اختصر الرابط قدر الامكان
التحكم بظني سيكون داخل مجلد
dir1
لا افقه من هذه الطريقة شيء رغم قرائتي لبعض الشروحات
ممكن بالتمثيل على روابطي افهم :)
لدي خبرة بسيطة في php
انتظركم …
بارك الله فيك الى الامام