تا %60 تخفیف خرید برای 3 نفر با صدور مدرک فقط تا
00 00 00
در توسینسو تدریس کنید

آموزش URL Rewrite در آپاچی قسمت 1

URL Rewriting چیست؟

اغلب سایت های پویا در آدرس های URL صفحات سایت خود متغیرهایی دارند که برای سایت مشخص می کند که چه اطلاعاتی را برای کاربر به نمایش بگذارند. برای مثال ، نمونه URL زیر به اسکریپت مربوطه در سمت سرور می گوید که اطلاعات محصول شماره 7 را نمایش بدهد.

http://www.pets.com/show_a_product.php?product_id=7

مشکلات ساختار این نوع از url ها این است که اصلا در ذهن نمی مانند، خواندن این نوع url ها از پشت تلفن کار سختی هست (شگفت زده میشین اگه بدونین این روش انتقال url خیلی رایج هست). موتورهای جستجو و همچنین کاربران، از روی این نوع URL ها اطلاعات مفیدی راجع به محتوای صفحه بدست نمی آورند. با فرض اینکه این آدرس URL آدرس صفحه وبی باشد که برای خرید طوطی نروژی آبی رنگ هست اما آدرس URL اصلا این را از خود بروز نمی دهد. اگرچه این نوع ادرس دهی یک فرمت استاندارد و منصفانه میان تمامی صفحات وب هست اما می توان ان را معنایی تر ساخت.حال آدرس URL بالا را با آدرس URL زیر با هم قایسه کنید:

http://www.pets.com/products/7/

واضح است که URL دوم خیلی کوتاهتر ، خواناتر و مرتب تر شده است. اما بازهم محتوای واقعی صفحه را از روی URL نمی توان تشخیص داد. و همینطور موتورهای جستجو نیز نمی توانند محتوای صفحه را از روی URL تشخیص دهند. اما خوب ما هنوز هم می توانیم رویایی تر فکر کنیم. URL زیر را ببینید:

http://www.pets.com/parrots/norwegian-blue/

حالا با آدرس URL بالا حتی می توانید دقیقا بگوئید که به دنبال چه محتوایی در صفحه وب هستید. موتورهای جستجو می توانند واژه های درون URL را بر اساس علامت dash (-) به کار رفته از هم تفکیک کنند و بنابراین برای تشخیص بهتر محتوای صفحات وب از آن ها استفاده کنند. و همینطور این نوع URL به راحتی قابل به ذهن سپاری است و قابل انتقال به فرد دیگر است.

اما متاسفانه آدرس URL اخیر به راحتی قابل درک برای سرور وب نیست و ما باید با یک سری کارها که آن را بازنویسی URL (URL Rewriting) می نامیم برای سرور قابل فهم کنیم. در واقع با تکنیک URL Rewriting ما آدرس URL را برای درک سرور ترجمه می کنیم.

پلتفرم ها و ابزارها

بسته به نرم افزاری که روی سرور شما در حال اجرا است دسترسی شما به ماژول بازنویسی URL (URL Rewriting) می تواند باز باشد. اگر اینطور نیست خیلی ساده می توانید با تماس با شرکت میزبان وب خود این خواسته را در میان گذاشته تا دسترسی شما فعال شود.آپاچی ساده ترین سیستمی هست که اجرای URL Rewriting در آن فعال است. و معمولا با فعال شدن ماژول درون ساخته خودش به نام mod__Rewrite بازنویسی URL را امکان پذیر می کند. و کار با ماژول mod__Rewrite به سادگی ویرایش و بارگذاری یک فایل متنی text است.و اما IIS، که نرم افزار سرور مایکروسافت است، قابلیت URL rewriting را به عنوان یک استاندارد در درون خودش ندارد اما add-onهایی برای آن وجود دارد که این عملکرد را برای آن فعال می کند. ISAPI__Rewrite که کار با آن توصیه می شود. مثال هایی که ما در ادامه به آن می پردازیم مبتنی بر ماژول mod__rewrite سرور آپاچی هست.

بازنویسی URL ساده

برای شروع یک مثال ساده را در نظر می گیریم. در این مثال ما یک اسکریپت ساده php داریم که تنها یک صفحه وب را سرویس دهی می کند. URL این صفحه وب به صورت زیر است:

http://www.pets.com/pet_care_info_07_07_2008.php

ما می خواهیم URL صفحه وب ما واضح ترو خواناتر باشد و در ایده آل ترین حالت می خواهیم به صورت زیر باشد:

http://www.pets.com/pet-care/

برای اینکه این اتفاق بیفتد ما باید به نحوی به سرور بگوئیم که همه درخواست هایی که برای URL « pet-care» به سرور ارسال می شود به صورت داخلی به URL « pet__care__info__07__07__2008.php» ری‌دایرکت شود. حتما باید این اتفاق یعنی ری دایرکت شدن به صورت داخلی در سرور انجام شود زیرا ما نمی خواهیم کاربر در آدرس بار مرورگر خود تغییر آدرس را ببیند.برای تحقق این خواسته ابتدا ما بایستی یک سند متنی با نام «.htaccess» ایجاد کنیم تا دربرگیرنده قوانین بازنویسی باشد. این فایل حتما باید با همان نام باشد (مثلا « .htaccess.txt» و یا « rules.htaccess» نباشد). این فایل باید در دایرکتوری ریشه سایت قرار گیرد (مانند پوشه « pet__care__info__07__07__2008.php » در مثال ما). ممکن هم هست که در حال حاضر همچنین فایلی با نام .htaccess در دایرکتوری مذکور قرار داشته باشد که در این صورت کافی است آن را مطابق آنچه گفته خواهد شد ویرایش نمائید. و حال دستورات زیر را به فایل اضافه کنید:

# Turn on the rewriting engine
RewriteEngine On 
# Handle requests for "pet-care"
RewriteRule ^pet-care/?$ pet_care_info_01_02_2008.php [NC,L] 

دو نکته را به یاد داشته باشید: یکی اینکه هر آنچه که در یک خط بعد از علامت # تایپ شده باشد کامپایلر آپاچی آن را به عنوان کامنت در نظر گرفته و اجرا نمی کند. و دیگر اینکه خط دربرگیرنده RewriteEngine تنها یک بار در هر فایل .htaccess باید بیاید.و اما خط RewriteRule آن اتفاق سحرانگیزی است که باید رخ دهد. این خط به 4 قسمت شکسته می شود:

کلمه کلیدی RewriteRule: این کلمه کلیدی به آپاچی می گوید که باید یک بازنویسی URL انجام دهد.الگوی ^pet-care?$ : این الگو به آپاچی می گوید که هر درخواست URL ای به سمت سرور آپاچی ارسال شد آن را چک کند و ببیند آیا با این الگو منطبق هست یا نه. و اگر URL درخواستی با الگو منطبق بود سرور آپاچی باید بخش جایگزین شونده دستور (که در زیر معرفی می کنیم) را ، جایگزین URL درخواستی نماید.بخش جایگزین « pet__care__info__01__02__2003.php » : چنانچه URL درخواستی با الگو منطبق بود سرور آپاچی باید این بخش جایگزین شونده را ، جایگزین URL درخواستی نماید و سپس پردازش کند.

پرچم های [NC,L] : این پرچم ها به آپاچی می گویند که قانون بازنویسی را با چه شرایطی اجرا کند. در این مثال ما از 2 پرچم استفاده کردیم. پرچم « NC» که به آپاچی می گوید که قانون را بدون حساسیت روی بزرگی و کوچکی حروف (case-insensitive) اجرا کند. و پرچم «L» که به آپاچی می گوید که چنانچه این قانون شرایط انطباقش احراز شد و در نتیجه اجرا گردید دیگر قوانین بازنویسی بعد از این قانون را اجرا نکند.قانونی که در مثال بالا بررسی کردیم ساده ترین قانون بازنویسی URL و نیز اساس بسیاری از قوانین بازنویسی URL می باشد.

الگوها و جایگزین ها

قانون بازنویسی که در بالا برسی کردیم تنها برای ری دایرکت کردن درخواست ها به یک URL کار می کند. اما قدرت واقعی ماژول mod__rewrite زمانی بیشتر خودش را نشان می دهد که بوسیله آن گروهی از URL ها را بر اساس الگوهایی که بر آن منطبق می شوند بازنویسی کنیم.فرض کنید شما می خواهید تمامی URL های سایت خود را در مثالی که در ابتدا آوردیم بازنویسی کنید. در مثال اولیه ما آدرس URL به صورت زیر بود:

http://www.pets.com/show_a_product.php?product_id=7

و ما گفتیم که یک درجه بهتر این است که URL به صورت زیر باشد:

http://www.pets.com/products/7/

و اما حالا می خواهیم کلی تر به قضیه نگاه کنیم و با فرض اینکه آدرس URL تمامی صفحات مربوط به هر یک از محصولات شکل کلی زیر را دارند:

http://www.pets.com/show_a_product.php?product_id={یک عدد}

بر اساس این شکل کلی ما می خواهیم یک قانون بازنویسی URL کلی هم برای تمامی این صفحات بنویسیم. یعنی دوست داریم URL تمامی صفحات مربوط به محصولات مختلف آدرس URL ای به شکل زیر داشته باشند:

http://www.pets.com/products/{یک عدد}/

برای تحقق این امر ما نیازمند استفاده از «عبارات باقاعده» در تعریف الگویی هستیم که در قانون بازنویسی باید درج شود. عبارات باقاعده الگوهایی از رشته ها هستند که در فرمت خاصی نوشته می شوند تا برای سرور آپاچی به طور مناسبی قابل فهم و مدیریت باشند. یک نمونه الگوی نوعی که برای تعریف اعداد استفاده می شود به شکل زیر است:

[0-9]+

در مثال بالا براکت ها دربرگیرنده بازه ای از کاراکترها هستند و «0-9» مشخص می کند که این بازه کاراکتر محدود به ارقام بین 0 تا 9 می شود. علامت + بعد از براکت بسته نیز بیانگر تکرار حق انتخاب بین ارقام 0 تا9 است که براکت آن را مشخص می کند و این تکرار حق انتخاب حداقل یک بار باید رخ دهد. و بنابراین در کل این الگوی رشته ای مشخص کننده هر عدد دلخواه با هر تعداد رقم است که در URL مد نظر ما به شماره محصول اشاره دارد.توجه: بخش الگوی درون یک قانون بازنویسی به صورت پیش فرض همانند یک عبارت باقاعده رفتار می کند.

# Handle product requests
RewriteRule   ^products/([0-9]+)/?$   show_a_product.php?product_id=$1    [NC,L] 

اولین چیزی که در قانون بالا باید دقت کنید این است که ما قسمت عبارت باقاعده را درون پرانتز قرار دادیم زیر این امر امکان «ارجاع بازگشتی» (back-reference) به آن بخش از الگو را در بخش جایگزین شونده قانون برای ما فراهم می کند. $1 که در بخش جایگزین شونده قانون آمده است به معنای ارجاع به هر آن چیزی است که در اولین پرانتز بخش الگوی قانون آمده است. شما می توانید قوانینی بنویسید که چندین ارجاع بازگشتی داشته باشند و شماره هر ارجاع بازگشتی براساس ترتیب پرانتزها در الگوی قانون است.و اکنون این قانون اخیر به معنای این است که هر URL درخواستی به شکل domain.com//products//{number}// به URL قابل پردازش توسط سرور به صورت domain.com//show__a__product.php?product_id={same number} ری دایرکت گردد.

در مقاله بعدی در رابطه با بخش های سازنده یک قانون بازنویسی که شامل الگو، عبارت جایگزین شونده و پرچم هاست بیشتر توضیح داده خواهد شد و همین طور شرطهای ماژول mod__rewrite آپاچی را توضیح می دهیم و چند مورد تکمیلی دیگر.

نویسنده : Prober

منبع : جزیره لینوکس و سیستم های متن باز وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

نظر شما
برای ارسال نظر باید وارد شوید.
5 نظر
افرادی که این مطلب را خواندند مطالب زیر را هم خوانده اند