الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس خفيف: mod_rewrite مع apache

مغلق
بدأه eech55 في 22 أكتوبر 2006 · 8 رد · 3,539 مشاهدة · في نظام تشغيل Unix & Linux
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هذه خاصية رائعة، وفي نفس الوقت سهلة ومفيدة..

كنت مجربها في خادم المنزل منذ سنوات

والآن قمت بتجربة في موقعي على الإنترنت وأردت معرفة لو كان يعمل مع الـ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

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

1

إذا نفعتك أحد مشاركاتي فأدع بظهر الغيب لوالداي بالصحة والسلامة والسعادة وطول العمر وأن يكون هذا زيادة لهما في كل خير.

post-21836-1257612765.gif

before asking: smart questions how-to

#2

خاصيه رائعه

شكرا لك وزادك الله علما

#3

توضيح وشرح رائع مشكورررررررررررررررررررررررر

توضيح وشرح رائع مشكورررررررررررررررررررررررر

2129cdd84c.gif

danger.gif
#4

مشكورين على المرور..

هذا مثال أكثر عملية..

قمت بتحديث الروابط المهمة في موقعي http://itlizard.com

قمت بتحويل الروابط من:

وهذا هو ملف .htaccess

RewriteEngine on

RewriteRule articles_read([0-9]*)\.html articles_read.cgi?id=$1 [L,NC]
RewriteRule articles_archive([0-9]*)-([0-9]*)\.html articles_archive.cgi?page=$2&cat=$1 [L,NC]

RewriteRule news_read([0-9]*)\.html news_read.cgi?id=$1 [L,NC]
RewriteRule news_archive([0-9]*)-([0-9]*)\.html news_archive.cgi?page=$2&cat=$1 [L,NC]

RewriteRule tuts_read([0-9]*)\.html tuts_read.cgi?id=$1 [L,NC]
RewriteRule tuts_archive([0-9]*)-([0-9]*)\.html tuts_archive.cgi?page=$2&cat=$1 [L,NC]

ملاحظة: الفرق بين .* و [0-9]* ان الأخير لا يشتمل على الحروف والرموز، إنما يقتصر على الأرقام فقط.

هذا الدليل حول regular expressions في perl.. الذي يريد التوسع في امكانيات regexp الهائلة يقرأه

http://perldoc.perl.org/perlre.html

إذا نفعتك أحد مشاركاتي فأدع بظهر الغيب لوالداي بالصحة والسلامة والسعادة وطول العمر وأن يكون هذا زيادة لهما في كل خير.

post-21836-1257612765.gif

before asking: smart questions how-to

#5

eech55 مشكور بارك الله فيك

سؤال هل regular expressions تختلف من لغة لأخرى يعني هل هي في بيرل نفس ال php

#8

مشكور

ويعطيك ربي الصحة والعافية

تسلم

#9

المبرمج عبدالكريم، اين وضعت ملف الـ.htaccess ؟

وهل انت متاكد من اسم الملف؟ "نقطة في البداية، ثم كلمة htaccess".. اهم شيء النقطة لا تنساها، وفي اليونكس معناه Hidden file

إذا نفعتك أحد مشاركاتي فأدع بظهر الغيب لوالداي بالصحة والسلامة والسعادة وطول العمر وأن يكون هذا زيادة لهما في كل خير.

post-21836-1257612765.gif

before asking: smart questions how-to

هذا الموضوع مغلق.

مواضيع مشابهة