تعرفنا في درس سابق على كيفية تفعيل وحدة mod_rewrite
وضبطها لإعادة كتابة عناوين URL في خادوم Apache.ا سنعتمد في هذا الشرح على ما تعلمناه سابقًا ونتوسّع - مع مثاليْن عمليّيْن - في شرحٍ بعض من أكثر التّعليمات استخداما في ضبط mod_rewrite
.
المثال الأول – تبسيط نصوص الاستعلام Query strings باستخدام RewriteRule
تستعمل تطبيقات الوِب في العادة نصوص الاستعلام التي يُمكن إضافتها إلى عنوان URL باستخدام علامة استفهام (?
) بعد العنوان. تُمرَّر المُعاملات المُختلفة باستخدام علامة &
. يُمكن استخدام نصوص الاستعلام لتمرير معلومات إضافيّة بين صفحات تطبيق الوِب.
على سبيل المثال، يُمكن لصفحة نتائج بحث مكتوبة بلغة PHP أن تستعمل عنوانا مثل http://example.com/results.php?item=shirt&season=summer
. في هذا المثال، هناك مُعاملان إضافيّان، المُعامل item
مع القيمة shirt
، والمُعامل season
ذو القيمة summer
. سيستعمل التّطبيق هذه المعلومات لتقديم أكثر نتيجة مناسبة للمُستخدم.
تُكتب قواعد إعادة الكتابة في Apache عادة لتبسيط روابط طويلة مثل التي أعلاه إلى عناوين URL بسيطة سهلة القراءة والفهم. في هذا المثال، نريد تبسيط ما سبق ليكون على شكل http://example.com/shirt/summer
. كما تُلاحظ، فالقيمتان shirt
و summer
لا تزالان مُتواجدتيْن داخل العنوان، لكن دون نصّ استعلام واسم ملفّ PHP.
إليك قاعدة لتحقيق مُرادنا:
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
المقطع shirt/summer
واضح وقد أخبرنا Apache بتوجيه أي طلبات مطابقة إلى العنوان results.php?item=shirt&season=summer
.
تُستخدم الخيارات [QSA]
عادة في قواعد إعادة الكتابة. وتُخبر Apache بإضافة أي نصّ استعلام إضافي إلى عنوان URL المُقدَّم، لذا لو كتب زائر http://example.com/shirt/summer?page=2
فسيجيب الخادوم بـ results.php?item=shirt&season=summer&page=2
. إن لم تُضف هذه الخيارات فسيُتجاهل نصّ الاستعلام الإضافي.
رغم أنّ هذه الطّريقة تُحقّق هدفنا، إلّا أنّنا كتبنا القيمتين بصراحة داخل الملفّ. لذا فالقاعدة لن تعمل لأي قيم أخرى مثل pants
وwinter
.
لجعل القاعدة عامّة أكثر، يُمكننا استخدام التّعابير النّمطيّة لمُطابقة أجزاء من العنوان الأصلي واستعمالها في مقطع بدل نمطي. بحيث تكون القاعدة المُعدّلة كما يلي:
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
التّعبير النمطي الأول داخل القوسين يُطابق أي مقطع نصّ مكوّن من أحرف وأرقام مثل shirt
و pants
ويحفظ المقطع المُطابق في المُتغيّر $1
. التّعبير النمطي الذي يتبعه يُطابق حرفيًّا كلّا من summer
، winter
، fall
و spring
، ويحفظ أي مُطابق في المُتغيّر $2
.
تُستعمل المقاطع المُطابقة بعدها في عنوان URL النّاتج لتمريرها إلى كل من المُعاملين item
وseason
عوضا عن كتابة القيمتين على نحو صريح كما فعلنا سابقا.
القاعدة أعلاه ستستبدل على سبيل المثال العنوان http://example.com/pants/summer
إلى http://example.com/results.php?item=pants&season=summer
. هذا المثال قابل للتماشي مع التّطويرات المُستقبليّة كذلك، بحيث يُمكن إعادة كتابة العناوين لعدّة قيم باستخدام قاعدة واحدة فقط.
المثال الثّاني – إضافة شروط منطقيّة باستخدام RewriteConds
قواعد إعادة الكتابة ليست محصورة في قواعد تُترجم واحدة تلو الأخرى دون أية قيود. تُمكّننا تعليمة RewriteCond
من إضافة شروط لقواعد إعادة الكتابة للتحكم في وقت ترجمة القواعد. تتّبع RewriteCond
التّنسيق التّالي:
RewriteCond TestString Condition [Flags]
-
RewriteCond
: تعليمة الشرط. -
TestString
النّص الذي سيُجرى عليه الاختبار. -
Condition
نمط أو شرط للاختبار به. -
Flags
عبارة عن مُعاملات إضافيّة يُمكن لها تعديل الشّرط وقواعد التّحويل.
إذا أرجع شرط في RewriteCond
القيمة المنطقيّة true
(أي أنّ الشرط قد تحقّق)، فستُنفَّذ قاعدة RewriteRule
التي تلي الشرط مُباشرة. إن لم يتحقّق الشّرط فتُتجاهل القاعدة. يُمكن استخدام أكثر من شرط. يجب مبدئيًّا على جميع الشّروط أن تتحقّق لتطبيق القاعدة التي تليها.
على سبيل المثال، لنفترض بأنّك تريد إعادة توجيه جميع الطّلبات المُوجّهة إلى ملفّات أو مُجلّدات غير موجودة إلى الصّفحة الرّئيسيّة عوضا عن عرض صفحة الخطأ 404. يُمكن تحقيق هذا الهدف بالشّروط التّاليّة:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /
في المثال أعلاه:
-
%{REQUEST_FILENAME}
يُمثّل النصّ المُختبَر. في هذه الحالة، القيمة ستكون عبارة عن اسم الملفّ الذي طلبه المُستخدم وهو مُتغيّر نظام خاص يتوفّر في كل طلب. -
f-
شرط متوفّر مُسبقا في وحدةmod_rewrite
للتّحقّق من أنّ الاسم الذي طلبه المُستخدم مُتواجد على القرص وبأنّه ملفّ فعلا. أمّا!
فهي علامة نفي. بجمعهما، فـf-!
تتحقّق من أنّ الاسم الذي طلبه الاستعلام غير مُتواجد أو أنّه ليس ملفّا. -
d-!
يعمل بطريقة مُشابهة ولكن بالنسبة للمجلّدات، إذ يُساوي القيمةtrue
فقط إن كان الاسم المطلوب غير موجود أو أنّه ليس مجلّدا.
ستُنفَّذ قاعدة RewriteRule
الموجودة في السطر الأخير فقط إن تلقى الخادوم طلبا لملفّ أو مُجلّد غير موجود. القاعدة بسيطة وكلّ ما تفعله هو إعادة توجيه الطّلب إلى موجّه الجذر /
في الموقع (والذي يكون عادة صفحة رئيسيّة).
خاتمة
mod_rewrite
وحدة مُفيدة جدّا في Apache يُمكن استخدامها لتوفير عناوين URL سهلة القراءة. في هذا الدّرس، تعلّمتَ كيفيّة استخدام تعليمة RewriteRule
لإعادة توجيه المُستخدمين حتى ولو كانت تتضمّن نصوص استعلام. تعلّمت كذلك كيفيّة إعادة التّوجيه حسب شروط باستعمال التّعليمة RewriteCond
.
للتّعرف أكثر على mod_rewrite
، ألق نظرة على هذه الصّفحة والتّوثيق الرّسمي لـmod_rewrite
من Apache.
ترجمة – بتصرّف - للمقال How To Rewrite URLs with mod_rewrite for Apache on Ubuntu 16.04 لكاتبه Mateusz Papiernik.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.