web-verzus-team
@web-verzus-team
Full Stack Developer

Реализация ЧПУ путем хранения связи "url"-"query" в базе данных. Ваши мнения?

Доброе время суток!
Интересует мнение специалистов по реализации ЧПУ таким методом:
Все запросы на сайт переадресовываюстя на index.php по следующему правилу:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [L]

Пример:
Есть строка вида site.com/notebook-lenovob550-da02ua, которая превращается в строку вида
site.com/index.php?url=notebook-lenovob550-da02ua
далее идет запрос к БД к таблице где хранятся связи url-query
SELECT `query` FROM `url_to_query` WHERE `url` = 'notebook-lenovob550-da02ua' LIMIT 1

и в php-переменную $query возвращается `query` вида "view=good&good_id=34" (либо 404, если связи не существует), затем переменную $query разбираю в массив $_GET
parse_str($query,$_GET);
соответственно появляются $_GET['view']='good' и $_GET['good_id']='34'
далее подключается шаблон вывода good.php - выведение страницы товара с id = 34.
Какие слабые стороны могут быть у этого метода, да и имеет ли "право на жизнь" он вообще?
p.s. Если криво объяснил - пишите в комментариях вопросы. Мне очень важно мнение специалистов!
  • Вопрос задан
  • 3728 просмотров
Пригласить эксперта
Ответы на вопрос 5
FanatPHP
@FanatPHP
Чебуратор тега РНР
Адов костыль.
Читай про MVC
Ответ написан
@IceJOKER
Web/Android developer
Посмотрите архитектуру у фреймворков и т.д. ведь там все это уже реализовано.
Чем в каждый раз дергать БД я бы сделал к примеру такую структуру папок/файлов как в yii, в зависимости от URL вызывается тот или иной класс/метод.
/catalog/view/1
создаете папку и файл в ней: controllers/CatalogController.php и добавляете туда метод view
Далее просто разбираете url и в зависимости от есть класс/метод или нет, показываете или выводите ошибку.
простой роутер написать можно за несколько минут, explode по слэшу, первый аргумент название класса, второй название метода, а все остальное передаете в метод и вуаля

ваш метод, что вы описали выше, я бы использовал для записи к примеру постов в блоге и так далее.

Все зависит от конкретно случая
Ответ написан
@asdz
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Если это slug - в бд имеет смысл хранить, но обязательно кэшировать, как вариант - напрямую nginx-ом из memcached отдавать. Но это при условии, что у вас как минимум n-уровневый урл. Т.е. если в вашем примере
`site.com/notebook-lenovob550-da02ua` выделенное - это контроллер NotebookController - тогда ок. Дело в том, что разбор ЧПУ - это часть работы любого запроса и если у вас он будет медленный - полярный лис уже подкрался и ждет))
Ответ написан
Комментировать
saksmt
@saksmt
PHP-developer, Backend
Имеет право на жизнь в Redis/Memcached, при условии, что Notebook - контроллер, а остальное slug.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы