Возможно ли убрать id из адресной строки?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

Добрый вечер.
Есть задача привести ссылки на сайте в более менее приличный вид.
Изначально ссылки были такого вида

Код: Выделить всё

"site.ru/car/show?region=region_name&city=city_name&mark=mark_name&model=model_name&id=23364"
Требуют убрать из адресной строки названия контроллера, действия и id.
C частью задачи я справился.
Прописал правила в UrlManager, ссылки стали теперь более читаемыми.

Код: Выделить всё

"site.ru/region_name/city_name/mark_name/model_name/23364"
Но заказчик хочет, чтобы id тоже не было, то есть, ссылка должна выглядеть в адресной строке так

Код: Выделить всё

"site.ru/region_name/city_name/mark_name/model_name"
Говорит, что так будет лучше для seo.
Подскажите, каким образом можно убрать id из адреса, но чтобы id всё-равно передавался на сервер?
Можно ли это сделать стандартными средствами urlManager?

p.s
Правила urlManager()

Код: Выделить всё

'<region:[\w\-]+>/<city:[\w\-]+>/<mark:[\w\-]+>/<model:[\w\-]+>/<id:\d+>' => 'car/show',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<model:[\w\-]+>' => 'car/search-by-mark',
'<mark-name:[\w\-]+>/<mark:[\d]+>' => 'car/search-by-mark',
'<region-name:[\w\-]+>/<region:\d+>' => 'car/search-by-region',
'<region-name:[\w\-]+>/<city-name:[\w\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-city',
'<city-name:[\w\-]+>/<city:\d+>' => 'car/search-by-city',
'<mark-name:[\w\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-region-city-mark',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-region-city-mark-model',
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

slo_nik писал(а): 2018.03.01, 18:36 Подскажите, каким образом можно убрать id из адреса, но чтобы id всё-равно передавался на сервер?
а как вы думаете можно ли не передавать параметр на сервер получить его там? ;)

можно id заменить на какой-то другой уникальный параметр, к примеру slug
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Возможно ли убрать id из адресной строки?

Сообщение yan »

самый простой и часто используемый вариант - ид как часть имени site.ru/region_name/city_name/mark_name/model_name-id, но особо большим любителям сео и это может не понравится, если ид убрать совсем то придется контролировать уникальность model_name, хотя бы в рамках своего /region_name/city_name/mark_name/ , и по имени уже искать ид
ну и в целом подобные задачи делают конечно не настройками urlManager, а реализацией своего UrlRule
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

shnir писал(а): 2018.03.01, 19:05
slo_nik писал(а): 2018.03.01, 18:36 Подскажите, каким образом можно убрать id из адреса, но чтобы id всё-равно передавался на сервер?
а как вы думаете можно ли не передавать параметр на сервер получить его там? ;)

можно id заменить на какой-то другой уникальный параметр, к примеру slug
Я понимаю, что нельзя. Но может как-то скрыть его можно, как, например, имя контроллера или действия.
Slug не устраивает. Я пытался объяснить, что id нужен по-любому, но вот заказчика это не устраивает.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

yan писал(а): 2018.03.01, 19:17 самый простой и часто используемый вариант - ид как часть имени site.ru/region_name/city_name/mark_name/model_name-id, но особо большим любителям сео и это может не понравится, если ид убрать совсем то придется контролировать уникальность model_name, хотя бы в рамках своего /region_name/city_name/mark_name/ , и по имени уже искать ид
ну и в целом подобные задачи делают конечно не настройками urlManager, а реализацией своего UrlRule
Контролировать model_name и mark_name вроде получится. В таблицах они встречаются по одному разу. Например ford focus, в одной таблице хранится ford, в другой focus. Но вот id, который передаётся в адресе нужен для третьей таблицы, где собраны все данные по конкретной машине. Там и id модели и id марки и ещё куча параметров.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

slo_nik писал(а): 2018.03.01, 19:31 Я понимаю, что нельзя. Но может как-то скрыть его можно, как, например, имя контроллера или действия.
скрываете контроллер вы правилом (но тут нужно тоже думать и проверять):

Код: Выделить всё

'<mark-name:[\w\-]+>/<mark:[\d]+>' => 'car/search-by-mark',
'<region-name:[\w\-]+>/<region:\d+>' => 'car/search-by-region',
'<city-name:[\w\-]+>/<city:\d+>' => 'car/search-by-city',

'<region-name:[\w\-]+>/<city-name:[\w\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-city',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-region-city-mark-model',
я не думаю что у вас правильно срабатывают вот эти правила, потому как urlManager передаст управление первому найденному правилу
и вы не сможете попасть в

Код: Выделить всё

'<city-name:[\w\-]+>/<city:\d+>' => 'car/search-by-city',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-region-city-mark-model',
по тем правилам которые вы привели в первом сообщении

-----------------------------------------------------------------------------------------------------------------------------------
slo_nik писал(а): 2018.03.01, 19:31 Но может как-то скрыть его можно?
shnir писал(а): 2018.03.01, 19:05 а как вы думаете можно ли не передавать параметр на сервер получить его там? ;)
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

slo_nik писал(а): 2018.03.01, 19:33 Контролировать model_name и mark_name вроде получится. В таблицах они встречаются по одному разу. Например ford focus, в одной таблице хранится ford, в другой focus. Но вот id, который передаётся в адресе нужен для третьей таблицы, где собраны все данные по конкретной машине. Там и id модели и id марки и ещё куча параметров.
я так понимаю это какой-то портал объявлений и с точки зрения СЕО для ссылки на страницу объявления было бы правильнее использовать
/ad/<slug>
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

shnir, действительно, не сработали. Что именно в этих правилах не так?
Сайт это портал объявлений, насчёт slug подумаю.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

правила описанные по вашим паттернам для urlManager выглядят одинаково, а если он нашел подходящее правило то дальше он ничего не ищет
http://www.elisdn.ru/blog/68/urlmanager ... nversation
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

shnir писал(а): 2018.03.02, 12:20 правила описанные по вашим паттернам для urlManager выглядят одинаково, а если он нашел подходящее правило то дальше он ничего не ищет
http://www.elisdn.ru/blog/68/urlmanager ... nversation
Получилось завести правила. Одно совсем убрал, остальным поменял порядок.
Сейчас выглядит всё вот так

Код: Выделить всё

'<region:[\w\-]+>/<city:[\w\-]+>/<mark:[\w\-]+>/<model:[\w\-]+>/<id:\d+>' => 'car/show',
'<region-name:[\w\-]+>/<city-name:[\w\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-city',
'<mark-name:[\w]+>/<mark:\d+>' => 'car/search-by-mark',
'<mark-name:[\w\-]+>/<region:\d+>/<city:\d+>' => 'car/search-by-region-city-mark',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<region:\d+>' => 'car/search-by-region-city-mark-model',// --
'<region-name:[\w\-]+>/<region:\d+>' => 'car/search-by-region',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<model:\d+>' => 'car/search-by-mark',
Вроде всё работает. Но!!!
Видите какие названия действий? И всё это в одном контроллере, свалено в одну кучу. Вообще я так и не понял, чего хотел добиться предыдущий разработчик. Связей нет, поисковых моделей нет. Вот в этом, я думаю, и есть главная проблема в настройках маршрутов.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

до 2х последних правил urlManager не дойдет
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

shnir писал(а): 2018.03.02, 13:57 до 2х последних правил urlManager не дойдет
Подошло, открывало нужную страницу. Хотя тут тоже странность. Во всех указанных действиях подключается одни и тот же файл. Много действий, но подключается одни и тот же файл в $this->render()
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

Код: Выделить всё

'<region-name:[\w\-]+>/<region:\d+>' => 'car/search-by-region',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<model:\d+>' => 'car/search-by-mark',
а вы попробуйте в этих экшенах при таких урл вывести что-то чтоб быть уверенным что именно этот экшен срабатывает
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

shnir писал(а): 2018.03.02, 14:14

Код: Выделить всё

'<region-name:[\w\-]+>/<region:\d+>' => 'car/search-by-region',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<model:\d+>' => 'car/search-by-mark',
а вы попробуйте в этих экшенах при таких урл вывести что-то чтоб быть уверенным что именно этот экшен срабатывает
Меня вот какой вопрос интересует. Имена действий разные, но ведут они на один и тот же файл в основном. Может ли это влиять на работу utlMnanager?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

нет
контроллер один, экшены разные
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

shnir писал(а): 2018.03.02, 14:51 нет
контроллер один, экшены разные
Смотрите, вот было такое правило

Код: Выделить всё

'car/show/<region:\w+|\w+\D+>/<city:\w+|\w+\D+>/<mark:\w+\D+>/<model:\w+|\w+\D+|\w+\D+\d>/<id:\d+>' => 'car/show',
Требовалось убрать имена контроллера и действия, в итоге получил такое

Код: Выделить всё

'<region:[\w\-]+>/<city:[\w\-]+>/<mark:[\w\-]+>/<model:[\w\-]+>/<id:\d+>' => 'car/show',
Сама ссылка выглядит так

Код: Выделить всё

<a target="_blank" class="list-auto__a" href="<?= Url::to(['car/show',
    'region' => remove_accents(Cars::getRegionName($car['car_region'])),
    'city' => remove_accents(Cars::getCityName($car['car_city'])),
    'mark' => remove_accents(Cars::getMark($car['mark'])),
    'model' => remove_accents(Cars::getModel($car['model'])),
    'id' => $car['id']]); ?>" data-pjax="0">
Делаю по принципу, какие параметры передаются в ссылке, такие и пишу в правилах.
Или не верно всё это?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

ссылки то создаются правильно при открытии таких ссылок не сработают последние правила
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

shnir писал(а): 2018.03.02, 15:07 ссылки то создаются правильно при открытии таких ссылок не сработают последние правила
Я понял, что проблема с очередностью правил в urlManager. Никак не могу понять, по какому принципу они выстраиваются.
Читал документацию, смотрел разные видео, но... Пока не пойму.
И ещё, влияет ли очередность параметров в ссылке и в правилах? Я о том, что в похожих ссылках параметры могут располагаться в разном порядке, значит и правила получаются разные, хотя разница буквально на один-два параметра.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Возможно ли убрать id из адресной строки?

Сообщение andku83 »

это видео посмотрите и главное послушайте
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

Re: Возможно ли убрать id из адресной строки?

Сообщение slo_nik »

andku83 писал(а): 2018.03.02, 15:58
это видео посмотрите и главное послушайте
Посмотрел и послушал. Вроде стало более понятно, но всё таки остался один вопрос.
Есть два правила, которые перекрывают друг друга. Как мне их разделить? Никак не пойму.
В конечном счёте правил urlManager сейчас выглядят так

Код: Выделить всё

 '<mark-name:[\w\-]+>/<model-name:[\w\-]+>' => 'car/search-by-mark',
 '<mark-name:[\w]+>' => 'car/search-by-mark',
 '<region-name:[\w\-]+>/<city-name:[\w\-]+>' => 'car/search-by-city',
 '<region-name:[\w\-]+>' => 'car/search-by-region',
 '<region:[\w\-]+>/<city:[\w\-]+>/<mark:[\w\-]+>/<model:[\w\-]+>/<id:\d+>' => 'car/show',
 '<region-name:[\w\-]+>/<city-name:[\w\-]+>/<mark-name:[\w\-]+>' => 'car/search-by-region-city-mark',
 '<region-name:[\w\-]+>/<city-name:[\w\-]+>/<mark-name:[\w\-]+>/<model-name:[\w\-]+>' => 'car/search-by-region-city-mark-model',
Правила

Код: Выделить всё

 '<mark-name:[\w\-]+>/<model-name:[\w\-]+>' => 'car/search-by-mark',
и

Код: Выделить всё

 '<region-name:[\w\-]+>/<city-name:[\w\-]+>' => 'car/search-by-city',
перекрывают друг друга, срабатывает первое. Второе правило не срабатывает и приводит в действие 'car/search-by-mark'
Как можно разделить эти правила, чтобы они работали?
Ответить