Php 如何在Kohana中将domain.com/locale/controller路由到domain.com/controller?

Php 如何在Kohana中将domain.com/locale/controller路由到domain.com/controller?,php,localization,kohana,kohana-3,routes,Php,Localization,Kohana,Kohana 3,Routes,我正在尝试在我的网站上实现本地化。目前,基本(英语)网站是在,我希望每个本地化是在。基本上,如果用户访问后一个URL,Kohana将使用与英语版本相同的控制器和操作。在代码中,我将简单地交换字符串 目前,我尝试添加以下路线,但没有成功: // This is my default route: Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' =&g

我正在尝试在我的网站上实现本地化。目前,基本(英语)网站是在,我希望每个本地化是在。基本上,如果用户访问后一个URL,Kohana将使用与英语版本相同的控制器和操作。在代码中,我将简单地交换字符串

目前,我尝试添加以下路线,但没有成功:

// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));
//这是我的默认路线:
Route::set('default','(/),我将得到一个404错误。你知道我应该如何设置我的路由来实现这一点吗

编辑:

为了完成matino和John Himmelman的回答,如果我按照建议简单地交换规则,它将起作用。但是,“locale”路由将成为“catch all”路由,并且您将始终必须指定区域设置,即使您只需要默认的区域设置(在我的示例中为“en”/“English”)。要解决这个问题,您可以限制“locale”参数设置为您支持的区域设置。例如:

Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('locale' => '(fr|zh|en)', 'overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));
Route::set('locale','(/(/(/)))',array('locale'=>'(fr | zh | en)',overflow'=>'。*?)
->默认值(数组)(
“控制器”=>“主控制器”,
“操作”=>“索引”,
));
路由::set('default'、'(/(/)))、array('overflow'=>'.'?'))
->默认值(数组)(
“控制器”=>“主控制器”,
“操作”=>“索引”,
));

在这种情况下,只支持以“fr”、“zh”或“en”开头的URL。此外,不受支持的地区将返回404错误和“domain.com/controller/action”将正确显示默认的英语区域设置。

Kohana按照路由在引导程序中出现的顺序应用路由。这就是为什么默认/全部捕获路由应始终在最后定义的原因

从文件:

重要的是要了解路线是按顺序匹配的 它们被添加,一旦URL与路由匹配,路由就被删除 基本上是“停止”的,剩余的路线从未尝试过。 因为默认路由几乎匹配任何内容,包括空路由 url,新路由必须放在它前面

正如所建议的,交换路由将解决此问题

// This the route for the localizations:
Route::set('locale', '(<locale>(/<controller>(/<action>(/<overflow>))))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));


// This is my default route:
Route::set('default', '(<controller>(/<action>(/<overflow>)))', array('overflow' => '.*?'))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));
//这是本地化的路径:
路由::set('locale','(/(/(/)))',array('overflow'=>'.*?'))
->默认值(数组)(
“控制器”=>“主控制器”,
“操作”=>“索引”,
));
//这是我的默认路线:
路由::set('default'、'(/(/)))、array('overflow'=>'.'?'))
->默认值(数组)(
“控制器”=>“主控制器”,
“操作”=>“索引”,
));
尝试交换规则(最通用的规则应为最后一条)