Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Как сделать всё и сразу в mod_rewrite?

Я пишу сайт на PHP, использую сервер Apache. Мне надо сделать редирект с адреса www, человекочитаемые URL, редирект на канонический URL, мультиязычность, запретить некоторые юзер-агенты, забанить пользователей по IP и ещё много чего с помощью mod_rewrite, причём чтобы всё это настраивалось через админку.
Как мне это сделать?


Ответ

Вы идёте неправильным путём. Если делать всё через mod_rewrite, то вы столкнётесь с кучей проблем:
Вы погрязнете в тоннах нечитаемого и неподдерживаемого кода. Этот язык не предназначен для сложной логики, хоть он и условно полон по Тьюрингу. Вы намертво прибьёте свой сайт гвоздями к серверу Apache. Если вы захотите воспользоваться nginx, то у вас возникнут серьёзные проблемы. Отлаживать правила практически невозможно. Если вы столкнётесь с багом, который не исправляется пристальным взглядом на код, то искать ошибку будет сложно. Если у вас редактируемые через админку правила (человекочитаемые URL, забаненные диапазоны IP и т. п.), то программно редактировать .htaccess будет проблематично.
В современных фреймворках и CMS повсеместно используется роутинг через фронт-контроллер. Вот всё, что вам нужно:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?_route=$1 [L,QSA]
Теперь в index.php вы будете иметь путь в $_GET['_route'], также сохранятся все остальные параметры в запросе GET. Вы можете писать какую вам угодно логику на языке, который вы хорошо знаете и понимаете, используя любые средства вроде доступа к конфигу для получения настроек роутинга и доступа к базе для получения забаненных диапазонов IP.
Если вас не смущает доступ к пути через $_SERVER['REQUEST_URI'] вместо $_GET['_route'], то вы можете упростить .htaccess ещё больше, как указано в примечаниях к другому ответу:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L,QSA]
P. S. Канонические URL обычно достаточно указать в мета-информации страницы. Редиректы из-за отсутствия / в конце лишь впустую тратят ресурсы.

Комментариев нет:

Отправить комментарий