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