Разделение SEO-дружественных URL-адресов

Мне нужно создать сайт (интернет-магазин) в Laravel, используя SEO-дружественные и иерархические URL-адреса.

Вот несколько примеров:

  • www.example.com/cat1/cat11 (который указывает на товарный лист категории)
  • www.example.com/cat1/cat11/cat111 (который указывает на товарный лист категории)
  • www.example.com/cat1/cat11/cat111/product-title (который указывает на страницу с описанием продукта)
  • www.example.com/contact-us (указывает на страницу)

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

Возможные мысли:

1) Добавьте префикс к каждому типу URL-адреса, чтобы узнать, например, контроллер.

  • www.example.com/categories/cat1/cat11/cat111> CategoryController
  • www.example.com/products/cat1/cat11/cat111/product-title> ProductController
  • www.example.com/page/contact-us> PageController

2) Предварительно сгенерируйте и сохраните в таблице все URL-адреса сайта. Таблица может содержать два столбца: URL-адрес (cat1 / cat11 / cat111) и модель: id (категория: 8). Глобальный контроллер проанализирует URL-адрес и с помощью таблицы сможет загрузить требуемую модель и идентификатор.

Есть еще идеи?


person Maverick    schedule 31.05.2019    source источник


Ответы (1)


Мы уже неоднократно сталкивались с этой проблемой. Думаю, "лучшего пути" не существует. Это зависит от данных обстоятельств.

Структуру /products/cat1/cat11/cat111/product-title следует использовать осторожно. Если канонический тег добавлен неправильно, это может привести к дублированию содержимого.

Мы закончили со следующей настройкой:

  • www.site.com/shop/product-title> Route::get('/shop/{slug}', [\App\Http\Controllers\ProductController::class, 'show'])->name('product.show');
  • www.site.com/shop/categories/cat1/cat11/cat111> Route::get('/shop/categories/{slugNum}', [\App\Http\Controllers\CategoryController::class, 'show'])->name('category.show')->where('slugNum', '(.*)');
  • www.site.com/contact-us> Route::get('/{any}', [\App\Http\Controllers\PageController::class, 'show'])->name('page.show')->where('any', '.*')->fallback();

Надеюсь это поможет.

person Jonas    schedule 31.05.2019