در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش 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

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

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

#ماژول_mod_rewriting #ری_دایرکت_آدرس_صفحه_وب_در_سمت_سرور #بازنویسی_url_برای_آپاچی
عنوان
1 آموزش URL Rewrite در آپاچی قسمت 1 رایگان
2 آموزش URL Rewrite در آپاچی قسمت 2 رایگان
زمان و قیمت کل 0″ 0
4 نظر
mahdikhanzadi

سلام خیلی عالی بود ادامه بدید من کلا راجب htaccess اموزش هایی که قشنگ تک تک کلمات رو توضیح داده باشند اصلا به فارسی ندیدم! اگه میشه مطالب رو کامل تر بزارید مثلا راجب rewrite_cond هم بنویسید! مرسی. من اموزش های شما رو راجب htaccess دنبال میکنم.

mahdikhanzadi

سلام پرچم QSA چیکار میکنه؟

prober

ممنون از اظهار لطفتون. بله سعی دارم ادامه بدم. این مقاله هم در مورد url-rewriting هنوزقسمت دوم هم داره که مطالبی که شما یاد آور شدید توی اون خواهد اومد.

در مورد پرچم QSA: این پرچم مخفف Query String Append هست به معنای لغوی الحاق رشته پرس و جو .

در مورد عملکرد این پرچم اول باید بدونید که اگر URL ارسال شده از سمت کلاینت طبق دستور rewriteRule نوشته شده با الگوی دستور منطبق باشه و نیز درون این URL رشته پرس و جویی وجود داشته باشه (query string که همان بخشی است که در آدرس URL بعد از علامت ؟ می آید)، اونوقت آپاچی رفتار پیشفرضش اینه که از جایی که کوئری استرینگ شروع میشه به بعد رو نادیده میگیره و url بخش جایگزین شونده دستور رو جایگزین میکنه. و برای اینکه دستور به آپاچی بفهمونه که کوئری استرینگ هم براش مهمه و باید در url ترجمه شده نهایی بیاد این پرچم رو در انتهای دستور میگذاریم.

برای مثال دستور زیر رو در نظر بگیرید:

RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]

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

/pages/123?one=two

خوب طبق دستور چون این URL در قسمت الگوی دستور منطبق میشه پس باید طبق دستور با عبارت جایگزین شونده ترجمه بشه و ضمن اینکه پرچم QSA هم لحاظ میشه و به صورت زیر در نهایت برای سرور اپاچی ترجمه میشه تا آپاچی بتونه پردازش رو انجام بده:

/page.php?page=123&one=two

و اما اگر پرچم QSA نبود URL به شکل زیر ترجمه میشد:

/page.php?page=123
mahdikhanzadi

مرسیییی، خیلی خوب بود

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

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