Страница 1 из 2
Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 18:36
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',
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 19:05
andku83
slo_nik писал(а): ↑2018.03.01, 18:36
Подскажите, каким образом можно убрать id из адреса, но чтобы id всё-равно передавался на сервер?
а как вы думаете можно ли не передавать параметр на сервер получить его там?
можно id заменить на какой-то другой уникальный параметр, к примеру slug
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 19:17
yan
самый простой и часто используемый вариант - ид как часть имени site.ru/region_name/city_name/mark_name/model_name-id, но особо большим любителям сео и это может не понравится, если ид убрать совсем то придется контролировать уникальность model_name, хотя бы в рамках своего /region_name/city_name/mark_name/ , и по имени уже искать ид
ну и в целом подобные задачи делают конечно не настройками urlManager, а реализацией своего UrlRule
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 19:31
slo_nik
shnir писал(а): ↑2018.03.01, 19:05
slo_nik писал(а): ↑2018.03.01, 18:36
Подскажите, каким образом можно убрать id из адреса, но чтобы id всё-равно передавался на сервер?
а как вы думаете можно ли не передавать параметр на сервер получить его там?
можно id заменить на какой-то другой уникальный параметр, к примеру slug
Я понимаю, что нельзя. Но может как-то скрыть его можно, как, например, имя контроллера или действия.
Slug не устраивает. Я пытался объяснить, что id нужен по-любому, но вот заказчика это не устраивает.
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 19:33
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 марки и ещё куча параметров.
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 20:07
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
а как вы думаете можно ли не передавать параметр на сервер получить его там?
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 20:10
andku83
slo_nik писал(а): ↑2018.03.01, 19:33
Контролировать model_name и mark_name вроде получится. В таблицах они встречаются по одному разу. Например ford focus, в одной таблице хранится ford, в другой focus. Но вот id, который передаётся в адресе нужен для третьей таблицы, где собраны все данные по конкретной машине. Там и id модели и id марки и ещё куча параметров.
я так понимаю это какой-то портал объявлений и с точки зрения СЕО для ссылки на страницу объявления было бы правильнее использовать
/ad/<slug>
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.01, 21:45
slo_nik
shnir, действительно, не сработали. Что именно в этих правилах не так?
Сайт это портал объявлений, насчёт slug подумаю.
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 12:20
andku83
правила описанные по вашим паттернам для urlManager выглядят одинаково, а если он нашел подходящее правило то дальше он ничего не ищет
http://www.elisdn.ru/blog/68/urlmanager ... nversation
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 13:16
slo_nik
Получилось завести правила. Одно совсем убрал, остальным поменял порядок.
Сейчас выглядит всё вот так
Код: Выделить всё
'<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',
Вроде всё работает. Но!!!
Видите какие названия действий? И всё это в одном контроллере, свалено в одну кучу. Вообще я так и не понял, чего хотел добиться предыдущий разработчик. Связей нет, поисковых моделей нет. Вот в этом, я думаю, и есть главная проблема в настройках маршрутов.
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 13:57
andku83
до 2х последних правил urlManager не дойдет
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 14:07
slo_nik
shnir писал(а): ↑2018.03.02, 13:57
до 2х последних правил urlManager не дойдет
Подошло, открывало нужную страницу. Хотя тут тоже странность. Во всех указанных действиях подключается одни и тот же файл. Много действий, но подключается одни и тот же файл в $this->render()
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 14:14
andku83
Код: Выделить всё
'<region-name:[\w\-]+>/<region:\d+>' => 'car/search-by-region',
'<mark-name:[\w\-]+>/<model-name:[\w+\-]+>/<model:\d+>' => 'car/search-by-mark',
а вы попробуйте в этих экшенах при таких урл вывести что-то чтоб быть уверенным что именно этот экшен срабатывает
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 14:19
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?
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 14:51
andku83
нет
контроллер один, экшены разные
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 15:02
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">
Делаю по принципу, какие параметры передаются в ссылке, такие и пишу в правилах.
Или не верно всё это?
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 15:07
andku83
ссылки то создаются правильно при открытии таких ссылок не сработают последние правила
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 15:12
slo_nik
shnir писал(а): ↑2018.03.02, 15:07
ссылки то создаются правильно при открытии таких ссылок не сработают последние правила
Я понял, что проблема с очередностью правил в urlManager. Никак не могу понять, по какому принципу они выстраиваются.
Читал документацию, смотрел разные видео, но... Пока не пойму.
И ещё, влияет ли очередность параметров в ссылке и в правилах? Я о том, что в похожих ссылках параметры могут располагаться в разном порядке, значит и правила получаются разные, хотя разница буквально на один-два параметра.
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.02, 15:58
andku83
это видео посмотрите и главное послушайте
Re: Возможно ли убрать id из адресной строки?
Добавлено: 2018.03.13, 20:31
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'
Как можно разделить эти правила, чтобы они работали?