Ещё раз про ЧПУ

Не секрет, что применение ЧПУ набирает всё большую популярность в интернете, и почти стало стандартом. Эта статья адресована в первую очередь начинающим PHP программистам, которые хотят разобраться с ЧПУ средствами PHP, по возможности без использования регулярных выражений.


Большинство статей в интернете предлагает реализацию ЧПУ на сайте через замену регулярными выражениями в файле .htaccess, что бывает не всегда удобно. Тонкая настройка не всегда происходит быстро и удобно. Иногда приходится повозиться. Кроме того это требует навыков составления регулярных выражений, а средства отладки mod_rewrite не всегда доступны.


При применении ЧПУ не стоит забывать про переменные, передаваемые методом GET и про возможность применения кирилицы.


В своих проектах уже 2 года пользуюсь этим решением:



Файл .htaccess



# Включаем mod_rewrite
RewriteEngine on

# Устанавливаем core.php индексным файлом
DirectoryIndex core.php

# Если файл физически не найден
RewriteCond %{REQUEST_FILENAME} !-s

# то направим на core.php с параметрами URI
RewriteRule ^(.+)$ /core.php?$1 [L]

Файл core.php



// Получаем текущий полный URL
$url = parse_url("http://".$_SERVER["HTTP_HOST"].$_SERVER['REQUEST_URI']);

// Распетрушиваем путь на «папки»
$dirs = explode('/', $url['path']);

// Парсим переменные GET в глобальный массив $_GET
isset($url['query']) && parse_str($url['query'], $_GET);

// Декодируем в UTF-8 все символы, отличные от латиницы
for ($i=1; $i<(count($dirs)-1); $i++) {
$dirs[$i]=urldecode($dirs[$i]);
}

Для того, чтобы посмотреть, что мы отпарсили, допишем в core.php следующий код:


// Выводим содержимое массива $dirs
for ($i=1; $i<(count($dirs)-1); $i++) {
echo '$dirs['.$i.']='.$dirs[$i].'<'.'br />';
}
print_r($_GET);

Теперь, если ввести в адресной строке
host/test/проверка/?id=1&operation=add
то вы получите примерно такой результат:


$dirs[1]=test
$dirs[2]=проверка
Array ( [id] => 1 [operation] => add )
Tags:
php, чпу, htaccess

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.