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