هذه خاصية رائعة، وفي نفس الوقت سهلة ومفيدة..
كنت مجربها في خادم المنزل منذ سنوات
والآن قمت بتجربة في موقعي على الإنترنت وأردت معرفة لو كان يعمل مع الـwebhost أم لا..
الجيد ان الملفات لازالت موجودة في موقعي، لذا هي فرصة جيدة لمن يريد ان يشاهد هذا على الهواء مباشرة :D
مقدمة
كلنا نشاهد الروابط تكون كهذه مع الصفحات الديناميكية
http://domain.zone/index.php?var1=foo&var2=foo
هذا الرابط فيه مشكلتين:
1- شكله قبيح
2- ستعاني من مشاكل مع محركات البحث
مالحل؟
اذا كنت تستخدم Apache فبلا شك.. استخدام mod_rewrite
كثيرا ماشاهدنا مواقع ديناميكية وفي نفس الوقت روابطها جميلة، على سبيل المثال هذا المنتدى:
http://www.itsallpolitics.com/russia-vt12859.html
الرابط جميل وسهل الحفظ + أيضا ديناميكي! بالإضافة إلى ذلك أليف مع محركات البحث لأنه يضع عنوان الموضوع في الـURL وهذا من احد الأسباب في جعل موقعك إحدى أولى المواقع الظاهرة في نتائج البحث
كيف تم ذلك؟
ذاك الموقع يستخدم شيئين:
1- mod_rewrite بحيث إذا استقبل apache طلب مشاهدة الصفحة المسماة russia-vt12859.html فإنه يقوم بتعامل معها كما لو كانت viewtopic.php?id=12859
2- تعديل كود الـphpBB بحيث يقوم بطباعة الروابط المعدلة عوضا من طباعة الروابط القديمة.. يعني يقوم بطباعة الروابط على هيئة topic_name-vtx.html حيث ان x هو الـtopic ID
هذا مثال مع شرح:
ممكن تقوم بالإعدادات إما في ملف httpd.conf او ملف .htaccess
اذا كانت لديك السلطة الكافية للتحكم في ملف httpd.confفبلا شك يجب عليك استخدامه لانه اسرع واكثر كفائة من .htaccess
اذا كان موقعك في شركة مستضيفة ولا تملك السلطة الكافية للتحكم في http.conf حينها يجب عليك استخدام .htaccess
ببساطة، في المجلد الذي يحتوي على الصفحات الديناميكية هذه، قم بصناعة ملف اسمه
.htaccess
اكتب في ذلك الملف الأوامر التالية:
RewriteEngine on RewriteRule page_(.*)\.html page.cgi?param=$1 [L,NC]
RewriteEngine on يقوم بتفعيل mod_rewrite
RewriteRule هنا مربط الفرس والقلب النابض.. والأمر الذي من خلاله تقوم بتحديد الرابط الذي تريد تغييره
الجملة التي تلي هي عبارة عن regular expression للـ URL الذي سيتم تغييره داخليا
page_(.*)\.html
لازم تكون فاهم شوية برمجة وبالأخص regular expressions.. ببساطة هذا يعني ان اي صفحة تبدأ بـ page_ وبعدها اي رمز، وثم تنتهي بـ.html يجب تحويلها _داخليا_ إلى page.cgi?param=$1 .. حيث ان $1 اسم لمتغير يحتوي على جميع ما هو بين الأقواس
[L,NC] هذه مجموعة options او كما يسمونها flags.. فالرمز L يعني last ويعني ان عملية التبديل المتعلقة بهذا الرابط قد انتهت ولا داعي لمتابعة المزيد فيما يتعلق بهذا الرابط.. لانه في معظم الأحيان سيكون عندك عدة RewriteRule مختلفة... اما الـ NC فمعناه no case، يعني قم بعملية المقارنة case insensitive.. بعبارة أخرى لا يهم لو كانت الحروف في الرابط كبيرة ام صغيرة.. يعني لا يهم لو كان الرابط PAGE_EECH55.HTML أم page_eech55.html
بالتالي إذا طلب المستخدم الرابط التالي: http://itlizard.com/page_eech55.html
سيتم تحويله داخليا إلى http://itlizard.com/page.cgi?param=eech55
وسيظهر للمستخدم ناتج الصفحة الديناميكية، إلا انه لا يرى عنوان الصفحة الديناميكية..
فApache يقوم بهذه العملية داخليا فقط، اما بالنسبة للمستخدم فالقضية بالضبط كما لو كانت صفحة ثابته.
تجربة عملية:
1- قمت بكتابة اسكربت في ملف اسمه page.cgi. ويحتوي على اوامر بسيطة وهي:-
#!/usr/bin/perl
use CGI;
my $cgi = new CGI;
my $param=$cgi->param('param');
print $cgi->header();
print "
<h1>Super Dynamic Page</h1>
Yer name is <b>$param</b>;)
";2- وبعدها قمت بكتابة الأوامر التالية في ملف .htaccess ووضعته في نفس المجلد الذي يحتوي على page.cgi
RewriteEngine on RewriteRule page_(.*)\.html page.cgi?param=$1 [L,NC]
وبعدها قمت بزيارة الرابط التالي: http://itlizard.com/page_eech55.html فشاهدت النتيجة الظاهرة من الpage.cgi بشفافية تامة.
اذا كنت تستخدم منتدى phpBB وأردت تحويل الروابط الجميلة، تابع هذا الموضوع
http://www.phpbb4you.com/phpbb-static-url-hack.html
اذا اردت مزيد من المعلومات حول mod_rewrite:
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
انصحك تقراها، لانه توجد أوامر أخرى لم اذكرها من باب التبسيط، وقد تحتاجها.. لكن الذي ذكرته يكفيك في معظم الأحيان..


