💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در آذرماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ هاجر اسدالله پور
rewrite module
محسن موحد حل شده توسط محسن موحد

سلام وقت بخیر

در مورد ماژول rewrite سوال دارم که چطور برای customize کردن url استفاده می‌شود.

سلام.

اگر ماژول rewrite داخل تنظیمات آپاچی، کامنت هست، از کامنت خارج کنید و آپاچی رو ریستارت کنید:

LoadModule rewrite_module modules/mod_rewrite.so

 

برای اینکه آدرس‌های سایتتون رو اصطلاحاً user-friendly کنید، یک فایل .htaccess داخل روت پروژتون ایجاد کنید.

ابتدا با دستور زیر ماژول رو فعال کنید:

RewriteEngine On

 

در خطوط بعدی میتونید قوانین آدرس هاتون رو بذارید.

فرم کلیه قوانین به شکل زیره:

RewriteRule pattern substitution [flags]

pattern: این همون رشته ایه که کاربر داخل مرورگرش وارد میکنه و شما الگورو با regex مشخص میکنید.

substitution: مسیر اصلیه سایت هست. در واقع این آدرس در سایتتون وجود داره و pattern در صورت تطبیق، باید به این آدرس ریدایرکت شه.

flags: تعیین میکنه RewriteRule چگونه کار کنه.(رفتار rule رو مشخص میکنه و اختیاریه)

 

داخل پروژتون فایلی دارید به نام about.php:

اگر بخواهید این صفحه رو باز کنید، باید در مرورگر http://example.com/about.php وارد کنید.

حالا میخواهید به وب سرور آپاچی بگید، اگر about خالی هم تایپ شد، باز هم about.php باز شود:

RewriteEngine on
RewriteRule ^about$ about.php [NC]

pattern: مشخص میکنه که با a شروع بشه و در ادامه bout و با t تمام بشه. یعنی فقط کلمه ی about نوشته شده باشه. اگر الگو صحیح بود به about.php ریدایرکت شه.

* علامت $ انتهای url رو نشون میده. (در خود regex هم به معنی پایان الگو است.)

* فلگ NC بمعنای No Case هست و به حروف بزرگ و کوچیک حساس نیست.

با توجه به رول بالا، تمام آدرس‌های زیر، به یک صفحه ختم میشه:

http://example.com/about
http://example.com/About
http://example.com/about.php

* پترن به رشته ی بعد از domain-name/ اشاره میکنه:

http://example.com/++pattern++

 

اگر بخواهید برای صفحات مجزا رول‌های دیگه هم اضافه کنید، میتونید زیر هم رول هارو بنویسید.

یک مثال دیگه:

آدرسی داریم به فرم http://example.com/index.php?id=2

میخواهیم تبدیل شود به فرم: http://example.com/blog/2

RewriteEngine on
RewriteRule ^blog/(d+)/?$ index.php?id=$1 [QSA,L,NC]

(d+) : اشاره به رشته ی عدد با حداقل طول یک کاراکتر.

/? : انتهای url(در اینجا بعد عدد) میتونه / بیاد یا نیاد. (؟ اشاره به یکدونه یا هیچی)

$1 : اشاره به رشته ی داخل پرانتز (اگر بعد ازین پرانتز، پرانتز دومی هم داشتیم $2 به پرانتز دوم اشاره میکرد.)

فلگ QSA: میشه به لینک با & یک کوئری استرینگ دیگه append کرد.

فلگ L: به معنای Last که اگر این رول با url مطابقت داشت، پردازش متوقف شود و رول‌های دیگر بررسی نشود.

 

یک مثال دیگه:

فرم کلی آدرس:

http://example.com/index.php?r=controller/action/id

میخواهید این فرمها جواب بده:

-- http://example.com/controller
-- http://example.com/controller/action
-- http://example.com/controller/action/id

رول به شکل زیر است:

RewriteRule ^(.+)$ index.php?r=$1 [L,NC,QSA]

هر رشته ای با هر شکلی که در url نوشته شود بعنوان مقدار r پاس داده میشود.

 

یه سری دستورات دیگه هم وجود داره مثل RewriteCond که میتوانیم قبل از چک شدن یک رول، چندین Condition رو زیر هم بیاریم و در صورتی که شرط‌ها برقرار بود، بره سراغ رول و ...

 

* تمام این مراحل داخل فایل کانفیگ سرور هم میشه انجام داد ولی ازونجا که اغلب سایت‌ها روی هاست‌های اشتراکی است که دسترسی به فایل اصلی تنظیمات وجود نداره و همچنین روی سیستم هم اغلب چندین پروژه روی ومپ سرور و ... ران میکنیم، بنابراین از فایل .htaccess استفاده میکنیم. این فایل، داخل فایل اصلی تنظیمات وب سرور، فراخوانی شده است.

 

موارد کلی رو بصورت کوتاه اوردم. برای اینکه بیشتر آشنا بشید، مقالات انگلیسی رو سرچ بزنید، توضیحات بیشتری پیدا میکنید.

بهترین پاسخ
محسن موحد ۰۸ فروردین ۱۳۹۹، ۰۵:۳۹

چرا ویرایش پست، حذف میشه؟!!!

این قسمت:

-- http://example.com/index.php?r=controller
-- http://example.com/index.php?r=controller/action
-- http://example.com/index.php?r=controller/action/id

باید اصلاح بشه به فرم زیر:

-- http://example.com/controller
-- http://example.com/controller/action
-- http://example.com/controller/action/id

* index.php?r= باید حذف شه.

محسن موحد ۰۸ فروردین ۱۳۹۹، ۱۴:۱۴