我正在使用PHP 5.5和Kohana 3.3
我正在开发一个网站结构,它总是将用户的语言偏好作为uri的第一个“项目”。
例如:
mydomain.com/en/products
mydomain.com/de/store
现在,我确信有些用户会尝试聪明并输入类似的内容:
mydomain.com/products
这很好,我只是希望将它们重新路由到
mydomain.com/en/products
以保持一致。
只要uri在URI中只有一个“目录”,我在下面的代码就可以了。
mydomain.com/products
mydomain.com/store
但不是像其他子目录那样的uris:
mydomain.com/products/something
mydomain.com/store/purchase/info
以下是我的路线:
Route::set('home_page', '(<lang>)')
->defaults(array(
'controller' => 'Index'
));
Route::set('default', '(<lang>(/<controller>(/<action>(/<subfolder>))))')
->defaults(array(
'controller' => 'Index',
'action' => 'index'
));
以下是我的父控制器中的每个其他控制器继承自:
的代码public function before()
{
$this->uri = $this->request->uri();
$this->lang = $this->request->param('lang');
//If user directly inputted url mydomain.com without language information, redirect them to language version of site
//TODO use cookie information to guess language preferences if possible
if(!isset($this->lang))
{
$this->redirect('en/', 302);
}
//If the first part of path does not match a language redirect to english version of uri
if(!in_array($this->lang, ContentManager::getSupportedLangs()))
{
$this->redirect('en/'.$this->uri, 302);
}
}
答案 0 :(得分:1)
你可以用这个给出的两条路线替换:
Route::set('default', '(<lang>/)(<controller>(/<action>(/<subfolder>)))',
array(
'lang' => '(en|fr|pl)'
))
->defaults(array(
'controller' => 'Index',
'action' => 'index'
));
其中字符串(en | fr | pl)是您支持的语言的串联,即'('.implode('|', ContentManager::getSupportedLangs()).')'
。
如果这个解决方案仍然模糊不清,我很乐意更详细地解释它,但我希望您能够反思您的问题,因为您的第一个路线home_page
,与...相匹配mydomain.com/products
。
你的控制器&#39; before()
功能也应该修改。重定向不会起作用,因为您将最终重定向到例如重定向到重定向。 en/ru/Index
。那么为什么不保持简单并使用:
public function before()
{
$default_lang = 'en';
$this->lang = $this->request->param('lang', $default_lang);
}