十月CMS - 如何正确路由

12

我一直在审查十月CMS路由的文档(https://octobercms.com/docs/plugin/registration#routing-initialization),但我认为我可能漏掉了某些内容。我有一个名为“deals”的页面,它会呈现一些基本信息和一个插件(名为“deals”)组件。该页面通常出现在以下URL:

http://www.example.com/deals

但是,我希望创建一个路由,以便如果有人访问以下URL:

http://www.example.com/deals2

它将自动将它们路由回去

http://www.example.com/deals
我知道应该在我的插件目录中创建一个routes.php文件。但是,当我尝试使用时

Route::get('/deals2', function()
{
        return View::make('deals');
});

它抱怨找不到“deals”视图。我做错了什么?

另外,如何路由它,使我的主页

http://www.example.com

将路由到

http://www.example.com/deals

如果有帮助的话,我在我制作的网站上使用了一个“不太正规”的解决方案来重定向主页。将以下内容添加到您的 .htaccess 文件中:RewriteRule ^/?$ http://www.example.com/deals [R=301,NC,L] 您可以对其他要重定向的 URL 进行相同的操作,但是再次强调,这只是我使用的一种解决方法,因为我不知道如何正确地做到这一点... 所以并不是真正的答案。 - merodeador
这是一个不错的技巧,但我希望有一种内置的方法来实现它。感谢您的评论。 - user2694306
你是想特别重定向/deals2,还是任何类似于/deals[some-number]的路由? - BrokenBinary
2个回答

11

在基于 Laravel 的 OctoberCMS 中,要将一个路由重定向到另一个路由,可以执行以下操作:

// Redirect /deals2, /deals3, ... to /deals
Route::get('{dealSlug}', function($dealSlug) {
    return redirect('deals');
})->where('dealSlug', '^deals[0-9]+');

// Redirect homepage to /deals
Route::get('/', function() {
    return redirect('deals');
}

第一条路由使用带有正则表达式约束的路由参数,并将以数字结尾的任何以/deals开头的请求重定向到您的/deals路由。这意味着它将把/deals1/deals2/deals3等路由到/deals

第二条路由将把您的主页重定向到/deals

当然,重定向会增加额外的请求。如果您不想这样做,那么您可以在Apache或Nginx中进行重定向。

根据您的评论,如果您想要将/deals [any-number] / [anything]重定向到/deals/[that-same-anything],那么您将在第一条路由中添加一个可选路由参数。代码如下:

// The new first route
Route::get('{dealSlug}/{extra?}', function($dealSlug, $extra = '') {
    return redirect('deals/' . $extra);
})->where('dealSlug', '^deals[0-9]+');

当然,如果/deals/[anything]这个路径不存在,那么你会收到404错误。


这个很好用,谢谢。有一个问题,你如何调整第一次重定向以使其能够处理额外的URL片段(例如/deals2/ca-toronto将转到/deals/ca-toronto)? - user2694306

1
尝试使用Route::get('/deals2', function(){return Redirect::to('/deals')});,这将在额外的请求成本下重定向浏览器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接