• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

نحوه کار با بازنویسی مسیر، URL rewrite

Webiran.co

کاربر تازه وارد
تاریخ عضویت
2 ژوئن 2012
نوشته‌ها
5
لایک‌ها
7
محل سکونت
ارومیه
[h=2]URL Rewrite
[/h] بازنویسی مسیر، یکی از کارامد‌ترین روشهای بالا بردن رتبه سایت در موتور‌های جستجوست. بسیاری از صاحبان سایت‌ها، تنها به نام دامنه‌ سایتشان دقت می‌کنند، در صورتیکه مسیرهای درون هر سایت نیز به همان اندازه در به خاطر سپردن سایت، در رتبه سایت و در فهم بهتر محتوا مهم است.

با بازنویسی مسیر، URL Rewrite، می‌توانید مسیرهایی خوانا، دارای کلمات کلیدی، و مناسب برای موتورهای جستجو بسازید.
[h=1]بازنویسی مسیر چیست؟[/h] بازنویسی مسیر (URL rewrite) به نام‌های fancy URLs یا SEF – Search Engine Friendly نیز خوانده می‌شود. اغلب سایت‌های داینامیک، با متغیرهایی در URL، اطلاعات لازم برای سرور‌های را منتقل می‌کنند، که به این متغیرها Query String می‌گوییم.
کد:
[LEFT][SIZE=3]http://www.webiran.co/news.php?title=what-is-URL-rewrite[/SIZE]
[/LEFT]
این اطلاعات برای سرورهاست و اشاره به یک محتوای خاص دارد، پس هر محتوا دارای یک مسیر واحد می‌باشد. مشکل اصلی این نوع مسیر دهی، سردرگمی کاربران و موتور‌های جستجو در هنگام اشاره کردن به این صفحات است، به یاد آوردن آنها سخت است، برای کاربران نامفهوم هستند، نوشتن این مسیرها بر روی بروشورها زیبا نیست، خواندن آنها پشت تلفن خیلی سخت است، و موتورهای جستجو اطلاعات اندکی از این مسیر‌ها بدست می‌آورند.
«بازنویسی مسیر» باعث می‌شود که تمام این موارد تغییر کنند. به جای مسیر بالا شما می‌توانید مسیری مثل
کد:
[LEFT][SIZE=3]http://www.webiran.co/news/what-is-URL-rewrite[/SIZE]
[/LEFT]
داشته باشید که یادآوری و خوانایی آن بهتر و راحتتر است و موتورهای جستجو در تشخیص آنها راحتتر عمل می‌کنند. «بازنویسی مسیر» می‌تواند محتوا را از مسیر جدا کند، مسیری مثل WebIran می‌تواند به هر صفحه‌ای که دلخواه شماست اشاره داشته باشد و لزوما دیگر به محتوایی به نام about-us اشاره نمی‌کند. مسیرها بهSHORTCUTها یا لینک‌های سمبولیکی تبدیل می‌شوند که می‌توانند به هرجایی اشاره کنند.
[h=1]ابزار و محیط‌های لازم[/h] «موتور بازنویسی» توسط وب سرور در Web application framework اجرا می‌شود که کارش تغییر نحوه نمایش مسیرها می‌باشد. این موتور‌ها در Apache و IIS به ترتیب با نام‌های Mod_rewrite و ISAPI_Rewrite مشخص می‌شوند (Rewrite engine, 2012). ISAPI_Rewrite در IIS به طور استاندارد نصب نمی شود ولی به صورت برنامه جانبی (add-on) قابل نصب می‌باشد که کارایی بسیار نزدیک به mod_rewrite دارد. در اینجا ابتدا به بررسی روش mod_rewrite می‌پردازیم و در انتها روش ISAPI_Rewrite را مورد بررسی قرار می‌دهیم. اگر از سیستم عامل لینوکس استفاده می‌کنیم mod_rewrite معمولا همراه با Apache نصب می‌شود ولی اگر از سیستم عامل Windows یا Macintosh استفاده می‌کنید می‌توانید به ترتیب از نرم افزار WAMP یا XAMP برای نصب Apache استفاده کنید، که به طور استاندارد از این ماژول استفاده نمی‌کند.
[h=1]نصب در WAMP[/h] برای نصب ماژول mod_rewrite در WAMP 2.0، از مسیر زیر می‌توانید استفاده کنید.
کد:
[LEFT][SIZE=3]WAMP -> Apache -> Apache modules -> rewrite_module[/SIZE]
[/LEFT]
[h=1]اصول اولیه[/h] با یک مثال ساده شروع می‌کنیم. مسیر استانداردی به شکل زیر داریم که مربوط به یک صفحه PHP می‌باشد.
کد:
[LEFT][SIZE=3]http://www.webiran.co/article.php[/SIZE]
[/LEFT]
می‌خواهیم به شکل خوانای زیر آن را بازنویسی کنیم.
کد:
[LEFT][SIZE=3]http://www.webiran.co/Articles/[/SIZE]
[/LEFT]
برای این منظور، لازم است که به سرور بگوییم که مسیر /Articles/URL-Rewrite را به فایل article.php انتقال دهید. به این نکته همیشه توجه کنید که در هنگام نوشتن لینک‌ها در برنامه نویسی سایت، لازم است که لینک‌ها را به روش دوم بنویسیم، و تنها بازنویسی مسیر، مرورگرها را به لینک اول منتقل می‌کند بدون اینکه مسیر در آدرس‌بار تغییر کند. برای این منظور فایل متنی با پسوند “.htaccess” از نوع ASCII می‌سازیم. نام این فایل باید دقیقا همین، بدون هیچ پسوند و پیشوندی (مانند .htaccess.txt یا rules.htaccess) باشد. این فایل که یک فایل خاص برای سرور‌هاست باید در ریشه سایت ساخته شود.
این فایل، به دو منظور ساخته می‌شود، اولا Apache موتور بازنویسی را راه اندازی کند و دوما، قوانین بازنویسی را به Apache معرفی کند. محتوایاین فایل در این مثال به شکل زیر خواهد بود.
کد:
[LEFT][SIZE=3]RewriteEngine On # Turn on the rewriting engine 
 RewriteRule ^Articles/?$ article.php [NC,L] # Handle requests for "Articles"[/SIZE]
[/LEFT]
خط اول این عبارت، موتور بازنویسی را راه‌اندازی می‌کند و عبارت بعد از # توضیحات مربوط به هر خط می‌باشد. خط دوم قابل تقسیم به پنج قسمت زیر می‌باشد.
RewriteRuleیک قاعده را آغاز می‌کند.
^Articles/?$یک الگو طبق اصول Regular Expression است، Apache مسیرهای رسیده را با این الگو مقایسه می‌کند و اگر مسیر دارای این الگو باشد، آنگاه فایل article.php را در مرورگر نمایش می‌دهد.
article.phpمسیر جایگزین می‌باشد. اگر الگو در مسیر های رسیده باشد، این فایل در مروگر نمایش داده می‌شود.
[NC,L]پرچمی‌است که به Apache نحوی اجرای قواعد را نمایش می‌دهد، در اینجا از دو پرچم NC و L استفاده شده است که NC حساسیت به حروف بزرگ و کوچک در مسیر‌ها را حذف می‌کند، و L مشخص‌ می‌کند که اگر این قاعده بر روی مسیر اجرا شد، دیگر قاعده دیگری بر روی این مسیر اجرا نشود.
#Handle requests for “Articles”عبارت‌های بعد از # توضیحات هر خط می‌باشد.
[h=1]الگو‌های و جایگزین‌ها[/h] قاعده بالا تنها یک مسیر را به یک فایل منتقل می‌کند، اما قدرت واقعی موتورهای بازنویسی در تعیین گروهی از مسیر‌هاست که طبق الگوی خاصی همیشه نوشته می‌شوند. به مثال زیر توجه کنید، شما مسیری به شکل زیر دارید؛
کد:
[LEFT][SIZE=3]http://www.webiran.co/article.php?id=1[/SIZE]
[/LEFT]
و می‌خواهید که به شکل زیر بازنویسی کنید.
کد:
[LEFT][SIZE=3]http://www.webiran.co/Articles/1/[/SIZE]
[/LEFT]
عدد بعد از id، همیشه عدد است و می‌خواهیم که به شکل دوم بازنویسی شود، از این رو، سرور Apache به الگوی Regular Expression مناسب را برای یافتن اعداد در مسیر نیازمند است تا عدد یافته شده را در متغیر id قرار دهد و مسیر را به فایل article.php با متغیر id برابر با عدد یافته شده منتقل کند. الگوی زیر برای یافتن اعداد در استفاده می‌شود.
[0-9]+
در Regular Expression، براکت‌ها نشان دهنده مجموعه‌ای از کارکتر‌هاست، و 0-9 نشان دهنده همه اعداد است. علامت جمع در آخر باعث می‌شود تمام اعداد حداقل یک رقمی تا چند رقمی در مسیر‌ها جستجو شوند. به زبان ساده، این الگوی برای یافتن اعداد یک یا چند رقمی می‌باشد. حال که توانستیم عدد مورد نظر را بیابیم باید آن را در متغیری که بعد از id قرار دارد جای دهیم تا مسیر به درستی با تمام متغیرهایش منتقل شود. قاعده زیر را مشاهده کنید.
RewriteRule ^Articles/([0-9]+)/?$ article.php?id=$1 [NC,L]
اولین نکته در این قاعده، عبارت داخل پارانتر ([0-9]+) می‌باشد که باعث می شود بتوانیم به این مقدار بعدا مراجعه کنیم و در حافظه داشته باشیم تا اینکه در متغیر $1 آن را جایگذاری کنیم. $1 به سرور Apache می‌گوید که عبارتی که در قسمت پارانتر اول (عدد یک نشان‌دهنده این ترتیب است) پیدا شده است را در این قسمت جای دهد. قاعده بالا تمام مسیرهایی به شکل http://www.webiran.co/Article/{number} را به http://www.webiran.co/article.php?id={number} منتقل می‌کند.
در این مرحله لازم است که اطلاعات دقیقتری درباره Regular Expression داشته باشیم تا با پیدا کردن این الگوها در هر مسیر، مسیرها را به فایل‌های جایگزین مناسب منتقل کنیم.
[h=1]Regular Expressions[/h] خوشبختانه الگوهایی که در مسیرها در بیشتر مواقع استفاده می‌‌شود، پیچیدگی‌های زیادی ندارد و با اطلاعات اندکی از نحوه الگو نویسی می‌توان به هدف مورد نظر دست یافت. برای آزمون درستی الگوهای خود می‌توانید از ابزار آنلاین Regular Expression Testing Tool استفاده کنید.
در هنگام نوشتن مسیرها باید دقت کرد که از کارکترهایی که در Regular Expression معنی خاصی دارند استفاده نشود. یکی از معمول‌ترین مثال‌ها، استفاده از نقطه در مسیر‌هاست که در Regular Expression به معنی هر کاراکتری می باشد، که در هنگامی جستجو برای الگوها باعث بروز مشکل می‌شود. به عنوان مثال قاعده پایین تنها عبارت rss.xml را پیدا نمی‌کند، بلکه تمامی عبارت‌های نظیر rsslxml، و rss-xml را شامل خواهد شد.
RewriteRule ^rss.xml$ rss.php [NC,L] # Change feed URL
برای حل این مشکل بهتر است که از کاراکتر خاص \ برای در نظر نگرفتن نقطه به عنوان یک کاراکتر خاص به شکل زیر استفاده کنیم.
RewriteRule ^rss\.xml$ rss.php [NC,L] # Change feed URL
این الگو به دنبال rss.xml هایی می گردد که در آن نقطه دیگر معنی خاصی ندارد.
در اینجا بعضی از کارکترهای خاص Regular Expression را که بیشترین استفاده را در بازنویسی مسیر دارند توضیح می‌دهیم.
.هر کارکتری (تک)
*هر الگویی قبل ستاره می‌تواند صفر یا چند رقم باشد.
+هر الگویی قبل جمع می‌تواند یک یا چند رقم باشد.
{}اندازه حداقل و حداکثر را در خود دارد.
?مشخص کننده صفر یا یک کاراکتری است که بعد از علامت سئوال آمد است.
!در ابتدای الگو، به معنی NOT الگو می‌باشد.
^شروع یک خط را مشخص می‌کند، قبل از آن مهم نیست.
[^ ]به معنی معکوس مجموعه است.
[]مجموعه
[-]در یک مجموعه به معنی فاصله دو حد مجموعه می‌باشد.
()گروه، گروه قابل ارجاع
|یا
\در نظر نگرفتن یک کاراکتر
برای یافتن اطلاعات بیشتر می‌توانید به Regular Expressions Reference - Basic Syntax مراجعه کنید.
به مثال کاربردی‌تری دقت کنید، می‌خواهیم الگوی Articles/URL-Rewrite/ را پیدا کنیم و آن به فایل article.php?name=URL-Rewrite منتقل کنیم، قاعده زیر را داریم.
RewriteRule ^Articles/([A-Za-z0-9-]+)/?$ articles.php?name=$1 [NC,L]
قاعده بالا الگویی را نشان می‌دهد که با ^ آغاز شده است و عبارت‌های قبل آن مهم نیستند. عبارت داخل پارانتز‌ها در حافظه نگهداری خواهد شد و قابل ارجاع هستند. عبارت داخل براکت‌ها مجموعه‌ای را نشان می‌دهد که به دنبال آن هستیم که شامل تمام حروف بزرگ A-Z و حروف کوچک a-z و اعداد 0-9 و علامت خط تیره (که بعد از 9 آمده است) می‌باشد. بعد از مجموعه علامت مثبت نشان می‌دهد که از این مجموعه کلمات حداقل یک حرفی تا چند حرفی قابل یافتن است. با یافتن این چنین الگویی در مسیر، Apache آن را حفظ کرده و در قسمت $1 قرار می‌دهد و صفحه article.php را با متغیر name={Found String} مورد استفاده قرار می‌دهد. جدول زیر کمک زیادی به یاد آوری اصول ذکر شده می‌کند.
regular-expressions-cheat-sheet-v1.png

[h=1]پرچم‌ها[/h] پرچم‌ها که در انتهای هر قاعده آورده می‌شود به Apache می‌گوید که با هر قاعده چطور رفتار کند. الگو‌ها و جایگذین‌ها می‌تواند به حروف بزرگ و کوچک حساس باشند، یک قاعده می‌تواند آغازگر زنجیره‌ای از قواعد دیگر باشد و یا اینکه در هنگام اجرا شدن یک قاعده، قواعد دیگر اجرا نشوند. پرچم‌ها را در براکت می‌نویسیم و برای نوشتن چند پرچم برای یک قاعده از کاما در میان پرچم‌ها استفاده می‌کنیم. برخی از پرچم‌ها را در اینجا آورده‌ایم.
Cزنجیر شده به قاعده بعدی
CO=cookieکوکی خاصی را می‌سازد
E=var:valueمتغیر با مقدار مشخصی را می‌سازد
Fخطای 403 (غیر قابل مشاهده) را برای کاربر می‌فرستد
Gصفحه منتقل شده است، حذف شده است.
H=handlerیک نقطه دسترسی تعریف می‌کند
Lاگر این قاعده اجرا شود، تنها قاعده‌‌ای است که اجرا می‌شود.
Nقاعده بعدی هم اجرا شود.
NCحساس به حروف بزرگ و کوچک نباشد
Rموقتا به صفحه جدید منتقل شده و مسیر در آدرس‌بار مرورگر تغییر نمی‌کند.
R=301دائما به صفحه جدید منتقل شده و مسیر در ادرس بار مرورگر به آدرس جدید تغییر می‌کند.
S=xXتا قاعده بعدی را در نظر نگیر
T=mime-typeMime-type خاصی را به هاست اضافه کند
[h=1]جابه‌جا کردن فایل[/h] هنگامی که فایلی را از مسیر قبلی خود جابه‌جا می‌کنید، نمی‌توانید تمام لینک‌هایی را که به این صفحه داده شده است را تغییر دهید. از این رو لازم است که لینک‌های قدیمی را به صفحات جدید منتقل کنید، یا در هنگام آپلود سایت لازم است که مسیرهای رسیده را موقتا به یک مسیر دیگر راهنمایی کنید تا اینکه مراحل آپلود کامل شود. در هنگامیکه می‌خواهید مسیری را موقتا تغییر دهید بطوریکه در آدرس‌بار مرورگر کاربران آدرس قدیمی نمایش داده شود ولی محتوای آدرس جدید به آنها نمایش داده شود، از پرچم R استفاده می‌کنیم که به مروگر کد 302 را بازمی‌گرداند که نشان دهنده تغییر نکردن مسیر آدرس‌بار است ولی صفحه به یک آدرس جدید منتقل می‌شود. در مثال زیر تمام لینک‌هایی که دارای کلمه article باشند به سایت جدیدی منتقل می‌شوند، ولی این باعث نمی‌شود که کاربر مسیر جدید را در آدرس‌بار خود مشاهده کند.
کد:
[LEFT][SIZE=3]RewriteRule ^article/?$ http://www.new-domain.co/article/ [R, NC,L] #Temporary Move[/SIZE]
[/LEFT]
ولی در بعضی مواقع می‌خواهید که آدرس جدید در آدرس‌بار نمایش داده شود، در این صورت از پرچم R=301 که کد 301 را به مرورگر‌ها می‌فرستد استفاده می‌کنیم، تا اینکه مسیر در آدرس‌بار تغییر کند.
کد:
[LEFT][SIZE=3]RewriteRule ^article/?$ http://www.new-domain.co/article/ [R=301, NC,L] #Temporary Move[/SIZE]
[/LEFT]
این دو روش در هنگام جابه‌جایی کامل یک سایت از یک دامنه به دامنه دیگر و در هنگام آپلود دوباره سایت، بسیار مفید هستند.
[h=1]شروط[/h] در بازنویسی مسیر می‌توان از شروط نیز با استفاده از متغیرهای سرور استفاده کرد. شروط هنگامی که چند دومین را به یک دومین متصل می‌کنیم بسیار کارآمد است، بدین نحو که تمام درخواست‌هایی را که به یک دامین می‌رسد به دامین جدید بفرستیم. به عنوان مثال می‌خواهیم دامین http://www.webiran.co.ir را به WebIran منتقل کند، ولی اگر آدرس شامل http://www.webiran.co.ir/article/ باشد باید قسمت بعد از دامنه (article/) را نیز در انتهای مسیر جدید اضافه کنیم.
کد:
[LEFT][SIZE=3]RewriteCond %{HTTP_HOST} !^webiran\.co$ [NC] 
 RewriteRule (.*) http://www.webiran.co/$1 [L,R=301][/SIZE]
[/LEFT]
در خط اول این مثال عبارت RewriteCond آغاز یک شرط را به Apache اعلان می‌کند که متغیر سرور (%{HTTP_HOST}) را با الگوی (!^www.webiran\.co$) مقایسه می‌کند و اگر شرط درست باشد خط بعدی اجرا خواهد شد. در این مثال %{HTTP_HOST} برابر با http://www.webiran.co.ir خواهد بود و الگوی !^www.webiran\.co$ در آن جستجو خواهد شد، به علامت! که شرط را معکوس می کند دقت کنید. این شرط معادل است با اینکه اگر مسیری که به سایت http://www.webiran.co.ir می‌آید دارایwebiran.co نباشد، آن را طبق قاعده بعدی به مسیر http://www.webrian.co با تمام حروف بعد از دامنه (.*) منتقل می‌کنیم. پرچم‌ها در شرط‌ها نیز مانند قاعده‌ها عمل می‌کنند.
[h=1]استثناها و موارد خاص شروط[/h] بازنویسی مسیر علاوه بر روش مقایسه با الگوها دارای روش‌های دیگری برای نوشتن شرط‌هاست. مواردی خاص به روش زیر هستند.
<Patternمقایسه می‌کند که جمله اول کوچکتر از الگو باشد
>Patternمقایسه می‌کند که جمله اول بزرکتر از الگو باشد
=Patternمقایسه می‌کند که جمله اول با الگو برابر باشد.
-dمقایسه می‌کند که جمله اول دایرکتوری موجود در سایت باشد.
-fمقایسه می‌کند که جمله اول فایلی موجود در سایت باشد.
-sمقایسه می‌کند که جمله اول فایلی با حجم بالای صفر در سایت باشد.
-lمقایسه می‌کند که جمله اول، یک لیک بازنویسی شده (از نوع لینک‌های سمبولیک) باشد.
-Fمقایسه می‌کند که جمله اول، فایلی معتبر در سایت و قابل دسترسی باشد.
-Uمقایسه می‌کند که جمله اول، یک مسیر معتبر و قابل دسترسی در سایت باشد.
فرض کنید که می‌خواهیم در هنگام نبود فایل یا دایرکتور مورد نظر کاربر در وب سایت پیغام خطایی نمایش داده شود. برای این منظور لازم است که شرطی را بررسی کنیم که در آن نام فایل و دایرکتوری مورد نظر کاربر آزموده شود و در صورت درستی شرط پیغام خطا نمایش داده شود. بدین منظور ابتدا صفحه خطای مورد نظر را می سازیم که در اینجا به نام notfound.php نام گذاری شده است، عبارت زیر شرط مورد نظر را بررسی و مسیر را به سمت فایل مورد نظر بازنویسی می‌کند.
کد:
[LEFT][SIZE=3]RewriteCond %{REQUEST_FILENAME} !-f [NC] 
 RewriteCond %{REQUEST_FILENAME} !-d [NC] 
 RewriteRule . /http://www.webiran.co/notfound.php [L,R=301][/SIZE]
[/LEFT]
مثال بالا به پنج قسمت قابل تقسیم است.

  • RewriteCond – عبارت شرطی را شروع می‌کند.
  • {REQUEST_FILENAME}% - متغیر سرور است که نام فایلی را که از Apache درخواست شده است ارائه می‌کند.
  • !-f – یک استثنا است که مقایسه می‌کند، آیا جمله اول یک فایل معتبر در سایت نیست؟ درصورتی که فایلی با این نام در سایت موجود نباشد خط دوم اجرا می‌شود.
  • !-d – یک استثنا است که مقایسه می‌کند، ایا جمله اول همین شرط یک دایرکتوری معتر در سایت نیست؟ درصورتیکه دایرکتوری با این نام در سایت موجود نباشد خط سوم اجرا می شود.
  • خط سوم یک منتقل کننده ساده است که سایت را به آدرس WebIran منتقل می‌کند.
همانطور که مشاهده می‌کند در هنگامیکه دو شرط بعد از هم نوشته شوند، دو شرط با یکدیگر AND می‌شوند. برای اینکه حالت OR در شروط را داشته باشیم باید در قسمت پرچم اولین شرط، کلمهOR را به شکل زیر بنویسیم.
کد:
[LEFT][SIZE=3]RewriteCond %{REQUEST_FILENAME} !-f [NC,OR] 
 RewriteCond %{REQUEST_FILENAME} !-d [NC] 
 RewriteRule . /http://www.webiran.co/notfound.php [L,R=301][/SIZE]
[/LEFT]
در این صورت شرط اول و دوم با یکدیگر OR می شوند.

من تصمیم دارم، مقالات قدیمی سایتم را به اینجا منتقل کنم، برای مشاهده مقالات جدیدتر می‌توانید به سایت webiran.co مراجعه کنید.
 
بالا