Не секрет, что применение ЧПУ набирает всё большую популярность в интернете, и почти стало стандартом. Эта статья адресована в первую очередь начинающим 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 )