Laravel中的自定义子弹(URL)(使用htaccess是一个选项)

时间:2018-10-11 13:54:24

标签: .htaccess laravel-5 routing slug

我有这样的路由来自数据库

AllTargets

要访问此类别,URL为:

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

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

总有这样的方法来创建自定义URL或slug来更改URL:

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

因此,当用户单击诸如“ domain.com/category/cars”之类的链接时,他将被重定向到“ domain.com/cars”,并且控制器将其始终视为“ category / cars”类别。

函数如下:

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

这可以通过Laravel或htaccess完成吗?

请注意,我还有其他短网址,例如

public function getCategoryByRoute($category_route)

因此,我不想重定向或缩短所有URL。只是类别网址。

3 个答案:

答案 0 :(得分:1)

将路线放在最后:

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

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

当在控制器中找不到类别时,抛出异常。

答案 1 :(得分:1)

您的答案的一部分与重定向有关。可以使用Laravel本身来代替.htaccess。更好,因为如果您迁移到Nginx(或其他工具),则不必担心“ htaccess中的应用程序逻辑” ...

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

说明:

  • 所有内容都以'/ category / x'开头,其中x可以是[a-z],[0-9]和破折号范围内的任何内容
  • 它使用该输入来获取redirectPath
  • 它返回重定向

很明显,您需要额外的路由来捕获这些重定向...

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

顺便说一句,此解决方案中的默认重定向状态为302(临时移动)。如果您想使用301(永久移动):

redirect($redirectPath, 301);

答案 2 :(得分:0)

尝试在htaccess中使用RewriteRule

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

以下是与此相关的文档:Apache Mod Rewrite