Пользовательский слаг (URL) в Laravel (опция htaccess является опцией) - PullRequest
0 голосов
/ 11 октября 2018

У меня есть такие маршруты, поступающие из базы данных

$cat_routes = App\User::list_routes();

foreach ($cat_routes as $route){
    Route::get('/category/{'.$route->route.'}', CategoriesController@getCategoryByRoute');
}

Чтобы получить доступ к этой категории, URL-адрес будет:

domain.com/category/cars (or any category rather than cars)

Есть ли способ создать пользовательский URL или слаг для измененияURL-адрес, подобный следующему:

domain.com/cars (clothes, women, watches .... etc)

Поэтому, когда пользователь щелкает ссылку, например, «domain.com/category/cars», он перенаправляется на «domain.com/cars», и контроллер продолжает обрабатывать его каккатегория "категория / автомобили".

Функция выглядит следующим образом:

public function getCategoryByRoute($category_route)

Можно ли это сделать из Laravel или htaccess?

Обратите внимание, что у меня есть другие короткиеURL-адреса, такие как

domain.com/gallery
domain.com/login
......

Поэтому я не хочу перенаправлять или сокращать все URL-адреса.Просто URL категории.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Попробуйте использовать RewriteRule в своем htaccess.

RewriteEngine on
RewriteRule ^/category/(.*) /$1 [QSA]

Вот документы, связанные с этим: Apache Mod Rewrite

0 голосов
/ 11 октября 2018

Часть вашего ответа была о перенаправлении.Вместо .htaccess вы можете сделать это в самом Laravel.Лучше, потому что, если вы переходите на Nginx (или что-то еще), вам не нужно беспокоиться о «логике приложения в htaccess» ...

Route::get('/category/{categorySlug}', function($categorySlug) {
    $redirectPath = sprintf('/%s', $categorySlug);
    return redirect($redirectPath);
})->where('categorySlug', '[a-z0-9-]+');

Объяснение:

  • Он принимает все, начиная с '/ category / x', где x может быть любым из диапазонов [az], [0-9] и тире
  • Использует этот ввод для получения redirectPath
  • Возвращает перенаправление

Очевидно, вам нужны дополнительные маршруты для перехвата этих перенаправлений ...

Route::get('/{categorySlug}', 'CategoriesController@getCategoryByRoute');

Кстати, статус перенаправления по умолчанию в этом решении - 302 (Временно переехал).Если вы хотите иметь 301 (постоянно перемещенный):

redirect($redirectPath, 301);
0 голосов
/ 11 октября 2018

Поместите маршруты последними:

Route::get('/gallery', '...');
Route::get('/login', '...');

Route::get('/category/{category}', 'CategoriesController@getCategoryByRoute');
Route::get('/{category}', 'CategoriesController@getCategoryByRoute');

И если вы не найдете категорию в контроллере, сгенерируйте исключение.

...