ابتدا قبل از شروع این قسمت یه عذر خواهی کنم بایت وقفه طولانی که ایجاد شد بین قسمت قبلی و این قسمت ، خوب توی قسمت قبلی درباره ErrorDocument ، Redirects و password protection توضیح دادم و توی این قسمت توضیحات تکمیلی .htaccess براتون میگم بهمراه کد نویسی MVC .
نکته مهم : قبل از اینکه فایل .htaccess بسازید و توش کد بنویسید، برید توی فایل httpd.conf (اگه از wamp استفاده میکنید برید توی منوی wamp توی قسمت apache) و این خطی که در زیر انتخابش کردم پیدا کنید و اگه اول خط، کاراکتر # داشت ، کاراکتر # از اول خط پاک کنید و فایل ذخیره کرده و wamp ریستارت کنید .
۴) Deny visitors by IP address : میتونیم جلوگیری کنیم از بازدید بعضی بازدیدکنندگان از وب سایتمون یا اجازه بدیم فقط کاربران با یه رنج آی پی خاص بتونن از وب سایتمون بازدید کنن .
مثلاً فقط به ادمین سایت اجازه بدیم که بتونه صفحات حساس وب سایت ببینه و بقیه کاربران قادر نباشن .
۱
۲
۳
|
order allow,deny deny from 123.45.6. allow from all |
کد بالا به همه اجازه میده بتونن وب سایتو ببینن ولی کاربرانی که سه اکتد آی پی شون این ۱۲۳٫۴۵٫۶ هست اجازه بازدید از سایت ندارن .
۱
۲
۳
|
order allow,deny allow from 162.1.1.1 deny from all |
کد بالایی هم فقط به کاربری با آی پی ۱۶۲٫۱٫۱٫۱ اجازه میده از وب سایت بازدید کنه و اگه کاربری توی محدوده آی پی تعریف نشده باشه و بخواد وارد سایت بشه با خطای Forbidden مواجه میشه .
۵) DirectoryIndex : بصورت پیشفرض Apache بدنبال فایل index.php میگرده تا وب سایت با اون صفحه بیاره بالا (یعنی نشون بده) ، ولی میشه این پیشفرضو تغییر داد ،
من یه صفحه index.php توی آموزش قبلی ساختم که موقعی که نمایش داده میشد بصورت زیر بود
و حالا نمیخوام موقعی که وب سایتمو کسی باز میکنه صفحه index.php بصورت پیشفرض براش باز بشه میخوام index.html باز بشه .
کد index.html : فقط یه welcome توش نوشتم 🙂
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> < head > < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" /> < title >Untitled Document</ title > </ head > < body > welcome </ body > </ html > |
و حالا این کد توی .htaccess مینویسم .
۱
|
DirectoryIndex index.html |
و بعدش دوباره وب سایتمو باز میکنم میبینید که پیشفرضش تغییر کرد و صفحه که میخواستم باز شد .
خوب حالا اگه کدمونو به این صورت نوشته بودیم
۱
|
DirectoryIndex index.html index.cgi index.php |
Apache ابتدا به دنبال صفحه index.html میگرده تا نمایشش بده و اگه وجود نداشت میره سراغ index.cgi و در نهایت اگه این صفحه هم وجود نداشت index.php نمایش میده .
۶) Disable directory listings : با استفاده از این قابلیت میتونیم جلوگیری کنیم از نمایش بعضی از فایل ها با پسوند های مورد نظر خودمون، یا کلاً جلوگیری کنیم از نمایش فولدرهای وب سایت .
من سه تا فولدر با نام های About,Index,Login توی فولدر Views میسازم (فولدر views توی قسمت قبلی ایجاد کردیم) ، یه چند تا فایل با پسوند jpg. و txt. هم توی فولدر views میسازم (البته این فایل هارو بعدش پاک کنید، چون فقط واسه توضیح disable directory این فایهارو ایجاد کردم بدردمون نمیخوره) و حالا توی URL آدرس فولدر Views تایپ میکنم و enter میزنم .
میبینید که تمام محتویات views نمایش داده شد حالا اگه بخوایم فایل هایی با پسوند txt نمایش داده نشن بصورت زیر کد مینویسیم (توی فایل .htaccess)
۱
|
IndexIgnore *.txt |
یا اگه خواستیم فایل با پسوند jpg هم نمایش داده نشه کد بصورت زیر مینویسیم
۱
|
IndexIgnore *.txt *.jpg |
اگه کد بصورت زیر بنویسیم هیچ فایل و فولدری نمایش داده نمیشه ( انگار فولدر خالی هست )
۱
|
IndexIgnore * |
خوب حالا اگه وب سروری که شما وب سایتتونو روش آپ کردید فولدرهارو نمایش نمیده، میتونید با دستور زیر نمایش فولدر برای خودتون فعال کنید .
۱
|
Options +Indexes |
اگه خواستید کلاً فولدرهای سایتتون نمایش داده نشن میتونید از کد زیر استفاده کنید .
۱
|
Options -Indexes |
میبینید که دیگه اجازه نمایش فولدر بهمون نمیده .
خوب تا اینجا توضیحاتی که واسه .htaccess دادم کافی هست میریم سر بحث اصلیمون یعنی MVC ( توی ادامه آموزشها، قابلیت های دیگه htaccess براتون میگم ) واسه اطلاعات بیشتر میتونید به سایت زیر سر بزنید .
خوب حالا قبل از شروع MVC، کدهای زیر توی فایل .htaccess مینویسیم .
۱
۲
۳
۴
۵
۶
|
Options -indexes ErrorDocument 401 http://127.0.0.1/PHP-MVC/ ErrorDocument 403 http://127.0.0.1/PHP-MVC/ ErrorDocument 404 http://127.0.0.1/PHP-MVC/ ErrorDocument 500 http://127.0.0.1/PHP-MVC/ |
به جای PHP-MVC (اسم وب سایت من هست)، شما اسم وب سایت خودتونو بنویسید .
میبینید بعد از index.php هرچیزی وارد کنیم به ما خطایی نمیده که این خودش یه باگ محسوب میشه و حالا میاییم این باگ برطرف میکنیم.
فایل htaccess. بصورت زیر ویرایش میکنیم :
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
|
Options +FollowSymlinks RewriteEngine on Options -indexes ErrorDocument 401 http://127.0.0.1/PHP-MVC/ ErrorDocument 403 http://127.0.0.1/PHP-MVC/ ErrorDocument 404 http://127.0.0.1/PHP-MVC/ ErrorDocument 500 http://127.0.0.1/PHP-MVC/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] |
زمانی که بخوایم از Rewrite استقاده کنیم باید قبلش دو خط اول هم بنویسیم . ( البته واسه بعضی از سرورها )
d- و f- و l- یعنی بتونیم با تایپ کردن اسم فایل و فولدر توی URL به اون فایل یا فولدر دسترسی داشته باشیم ، $(*.)^ یعنی هر فایل و فولدری که توی URL وارد میکنیم ، url هم یه متغییر هست که بعداً توی کدها ازش استفاده میکنیم و ۱$ هم تمام مقادیری که بعد از اسم سایت وارد میکنیم شامل میشه .
کد زیر به index.php اضافه میکنیم :
۱
۲
۳
|
<?php echo $_GET [ 'url' ]; ?> |
بصورت شکل زیر :
این کد مقادیری که توی متغیر url وارد میکنیم (متغیر url توی کدهای htaccess تعریف کردیم) نمایش میده .
مثلاً زمانی که بعد از اسم سایت، مقداری بصورت بالا وارد میکنیم یعنی میخوایم تابعی (در اینجا run یه تابع هست) که توی کدهای کلاس Login نوشته شده اجرا بشه و اگه مقداری نیز بعد از run بیاد،این مقدار به عنوان مقادیر تابع (پارامتر تابع) به حساب میاد .
[QSA] زمانی به درد ما میخوره که بخوایم URL بصورت زیر وارد کنیم و از متغیری به نام b هم استفاده کنیم که در این صورت باید کد زیر به انتهای کد index.php (بعد از دستور echo) اضافه کنید تا نتیجه رو ببینید .
۱
|
echo '<br>' . $_GET [ 'b' ]; |
ولی اگه این [QSA] نزاریم در موقعی که میخوایم از متغیر b استفاده کنیم بهمون خطا میده .
خوب حالا میایم مقادیر url جدا میکنیم با استفاده از تابع ()explode ، کدهای php صفحه index.php بصورت زیر تغییر بدید :
۱
۲
۳
۴
۵
۶
۷
۸
|
<?php //echo $_GET['url']; //echo '<br>'.$_GET['b']; $url = $_GET [ 'url' ]; $url = explode ( '/' , $url ); print_r( $url ); ?> |
دو خط اول غیر فعال کردم چون دیگه بدردمون نمیخورن .
تابع explode مقادیر متغیر url$ جدا سازی میکنه بر حسب کاراکتر / و خروجیش هم یه آرایه هست .
دستور print_r مقادیر آرایه رو چاپ میکنه .
خوب طبق چیزی که با لا گفتم اگه URL چرت و پرت هم بنویسیم (بصورت زیر) به ما خطا نمیده
حالا با دستور زیر میگم فقط صفحاتی رو نشون بده که توی وب سایت هست . (کدهای php صفحه Index.php بصورت زیر ویرایش کنید)
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
|
<?php //echo $_GET['url']; //echo '<br>'.$_GET['b']; $url = $_GET [ 'url' ]; $url = explode ( '/' , $url ); //print_r($url); if (! file_exists ( "Controllers/" . $url [0]. ".php" )) { echo "Not Found Page" ; } ?> |
خوب حالا اگه دوباره چرت و پرت بنویسیم (بصورت زیر) به ما خطایی که خودمون نوشتیمو نشون میده، حتی میشه یه صفحه خطا درست کرد و کاربر رو به صفحه ی خطا منتقل کرد .
خوب حالا اگه URL بصورت زیر بنویسیم بهمون خطا میده و اینم یه باگ دیگه هست که باید رفع بشه .
بصورت زیر این باگ هم برطرف میشه . (کدهای php صفحه index.php بصورت زیر ویرایش کنید)
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
|
<?php //echo $_GET['url']; //echo '<br>'.$_GET['b']; if (!isset( $_GET [ 'url' ])) { $url = 'index' ; } else { $url = $_GET [ 'url' ]; } $url = explode ( '/' , $url ); //print_r($url); if (! file_exists ( "Controllers/" . $url [0]. ".php" )) { echo "Not Found Page" ; } ?> |
تابع isset چک میکنه که همچین متغیری ست شده یا نه ( یعنی همچین متغیری اصلاً وجود داره یا نه )
توی کد بالا گفتم اگه چیزی برای url ست نشده باشه، index براش ست بشه .