【问题标题】:Custom slug (URL) in Laravel (using htaccess is an option)Laravel 中的自定义 slug (URL)(使用 htaccess 是一个选项)
【发布时间】:2019-03-16 15:25:55
【问题描述】:

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

$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 或 slug 来更改 URL,如下所示:

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

因此,当用户单击“domain.com/category/cars”这样的链接时,他会被重定向到“domain.com/cars”,并且控制器会继续将其作为“category/cars”类别处理。

函数如下所示:

public function getCategoryByRoute($category_route)

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

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

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

所以我不想重定向或缩短所有 URL。只是类别 URL。

【问题讨论】:

    标签: .htaccess laravel-5 routing slug


    【解决方案1】:

    将路线放在最后:

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

    当你在控制器中没有找到类别时,抛出一个异常。

    【讨论】:

    • 将代码放在路线的末尾,现在可以正常工作了,非常感谢。
    【解决方案2】:

    您的部分答案是关于重定向。代替 .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 可以是 [a-z]、[0-9] 和破折号范围内的任何内容
    • 它使用该输入来获取重定向路径
    • 它返回一个重定向

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

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

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

    redirect($redirectPath, 301);
    

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 2012-03-28
      相关资源
      最近更新 更多