В моем htaccess есть такой код.
RewriteEngine On
# Не применять к существующим файлам файлам
RewriteCond %{REQUEST_FILENAME} !-f
# Не применять к существующим директориям
RewriteCond %{REQUEST_FILENAME} !-d
# Редирект всех запросов на index.php
# L означает Last, нужен чтобы на этом этапе mod_rewrite сразу остановил работу.
# Короче, небольшое увеличение производительности.
RewriteRule .* index.php [L]
Далее, в моем роуторе я обращаюсь через $_SERVER['REQUEST_URI']
Разбиваю его на части.
К примеру у меня есть два адреса.
site.ru/blog/one-day
site.ru/de/blog/one-day
Все что разделено косыми чертами, я отдал на откуп explode.
Роутору объяснил, что нулевой может иметь два значения и он это должен учитывать. Если в нем храниться только две буквы и не более, тогда он должен привести нас в изменение языка интерфейса. Если букв больше, тогда он должен привести нас в модуль, который мы хотим вызвать.
Если модуля нет, тогда нужно отправить пользователя на 404, но в моем случае я отправляю пользователя на главную.
Причем я делаю проверку не только на существование каталога для модуля, но и на существование некоторых файлов.
А $_GET параметры передаются автоматически и их не нужно обрабатывать.
site.ru/blog/one-day?page=comments&sort=desc
$_GET параметры сами подставятся как положено и их не нужно прогонять через роутер.
Аааа, простите, забыл добавить, что у меня есть второй explode, который в самом начале разделяет строку через знак ?
Мой файл имеет размер в 3.2 kb и 48 строк.
Но это только лишь из-за развернутых комментариев, которые я писал для себя, чтобы не запутаться.
Да, в таком роуторе должен быть метод, который пошлет куда подальше пользователя, если он будет безобразно вводить адрес сайта.
К примеру, у вас есть материал по адресу
site.ru/blog/one-day, но после one-day ничего нет, то тут должна сработать защита, которая просто прогонит пользователя на главную или подготовленную страницу для таких случаев.
Я реализовал это таким способом.
Есть метод error404(), который принимает номер элемента, после которого должна произойти остановка.
site.ru/blog/one-day
Только два элемента и третьего нет, тогда я вызываю метод error404(2) и все что будет введено после one-day, сработает остановка.
site.ru/blog/one-day/photo/city-berlin
error404(4) Все что больше четыре, сработает остановка.
Как-то так. А если на регулярках решать данную задачу, мне кажется это еще более нагружать сервер, да и казусы могут всякие быть.
Простите за такой длинный комментарий.
Это чисто мой велосипед и никого не призываю им пользоваться.