Здравейте, преди няколко дена гледах това видео за
Създаване на чисти url адреси с php и мисля, че ще бъде полезно за начинаещи, а и не само.Целта на упражнението е да направим url от вида:
http://domain.com/product.php?category=12 на
http://domain.com/product/category/12С този метод, ще премахнем лично за мен досадните символи "?","&","=", които са градивна част от GET метода на предаване на информация.
Преди да поясня някой неща, искам да кажа, че този ефект може да се постигне също, само и едиствено чрез модула mod_rewrite на apache-то:
RewriteEngine on
RewriteBase /
RewriteRule ^product/category/(\d+)$ product.php?category=$1
Ако искаме обаче всички url адреси на сайта да изглеждат така то тябва да пишем за всяка страница подобни правила, или пък да напишем определени, за които обаче трябват повечко познания по конфигурирането на apache за да няма неприятни моменти.
С метода от видеото ще направим url адресите изчистени с помоща на php без да са необходими някакви сериозни познания.
Нека въведем следния url адрес :
http://domain.com/index.php/product/category/12Ако съществува файла index.php в root директорията на сайта ще се визуализира неговото съдържание като частта след разширението .php няма да окаже влияние.Понеже тази част не представлява GET параметри възниква въпроса как да взмем стойностите.Нека видим при подадения по-горе адрес какво се съдържа в следните елементи на масива $_SERVER:
echo $_SERVER['REQUEST_URI'].'<br />'.$_SERVER['PATH_INFO'];
Вижда се, че в $_SERVER['PATH_INFO'] се съдържа само нужната ни част, а в $_SERVER['REQUEST_URI'] се съдържа и името на файла.Как да направим така, че хем да "премахнем" index.php от url адреса, хем да вземем нужната ни част?
Ами ще използваме модула mod_rewrite на apache-то:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
Най-общо казано редове по-горе правят следното: ако подадения адрес не е път до същестуващ файл на сървъра и не е път до съществуваща директория, то частта след домейна и неговото разширение ще бъде разбирано като index.php/частта след домейна и неговото разширение.
Пример:
http://domain.com/product/category/12 ще бъде разбиран като
http://domain.com/index.php/product/category/12Така вече в $_SERVER['REQUEST_URI'] ще се съдържа нужната ни част:
/product/category/12С помоща на функцията
explode можем да вземем стойностите между наклонените черти, като се създаде масив с елементи които съдържат тези стойности,като се започне от елемента с ключ 1.
Във видеото е използван елементарен клас, състоящ се от конструктор и два метода за взимането на тези стойности:
url.php
class url {
private $site_path;
public function __construct($site_path) {
$this->site_path = $this->removeSlash($site_path);
}
private function removeSlash($string) {
if($string[strlen($string) - 1] == '/') $string = rtrim($string, '/');
return $string;
}
public function part($part) {
$url = str_replace($this->site_path, '',$_SERVER['REQUEST_URI']);
return $url[$part];
else
return false;
}
}
В конструктора въвеждаме параметър, в който при инстанция на класа ще въвеждаме пътя до index.php файла.
1.ако е в root директорията пишем
/2.ако е в поддиректория
/поддиректория 3.ако е в поддиректория можем да я запишем и така
/поддиректория/(При случаи 1. и 3. ни е необходим метода
removeSlash.)
Във втория метод
part проверяваме дали съществува дадена част от url адреса ни.
Нека при адрес
http://domain.com/product/category/12 частта
product да бъде името на страницата, тоест стойността в $url[1], която се връща при извикването на метода
part ( $променлива->part(1) ).В index.php пишем:
//добавяме класа като посочваме пътя до него, в случая в директория classes
include 'classes/url.php';
//правим инстанция на класа
$url = new url('/');
//проверяваме дали сме в началната страница http://domain.com
$page = $url->part(1);
if(!$page)
include 'files/home.php';
//ако не сме проверяваме дали имаме такъв файл в поддиректория в случая files и го вмъкваме
else
include 'files/'.$page.'.php';
else {
header("Status: 404 Not Found"); include '404 error page';
}
И така в $url->part(2,3,и т.н) ще се съдържат другите части от url адреса, ако има такива, които можем да изпозлваме във вмъкнатите страници.Тези части всъщност могат да играят ролята на GET параметри като, ако искаме да проверим дали съществува дадена част:
//вместо
if(isset($_GET['category'])) //изпозлваме
if($url->part(2) == 'category')
Изгледайте видеото много е лесно за разбиране, може да си преправите кода според вашите предпочитания и начин на писане.