在CakePHP中强制URL上的语言前缀

时间:2012-12-16 00:09:53

标签: cakephp cakephp-2.3

我想强制我网站的网址始终有一个语言后缀。

因此,如果他们输入www.mysite.com,则应将其转到www.mysite.com/en

我有一种默认语言,因此如果是第一次访问该网站,则应该使用该语言。如果不是,我设置了一个可以使用的Cookie ...但是 - 我不知道在哪里使用它。

我考虑过检查网址中是否有“语言”参数,如果没有,重定向,但是 - 这似乎有点过分 - 是否有更好的方法?我可以在路线上这样做吗?或引导?

3 个答案:

答案 0 :(得分:1)

最有效的方法是通过您的网络服务器。您可以轻松检查请求是否适用于/(主页)并重定向到/en

检查您使用的Web服务器的文档,它们都有类似mod_rewrite或类似的内容。

修改

您可以设置/set_default_language之类的路由,以便在/的情况下重定向到该路由器,此控制器可以访问数据库并执行所需的操作。

或者,您可以在没有指定语言的情况下将其重定向到/your/usual/language_switch,并允许代码使用默认值。

答案 1 :(得分:0)

我做了什么:

我最终检查了AppController的beforeFilter()是否设置了$this->request->params['langauge'],如果没有,则相应地构建URL:

//Redirect to same url, but with language parameter
if (empty($this->request->params['language']) &&
empty($this->request->params['admin'])) {
    $defaultLanguageCode = Configure::read('Languages.default.code2');
    $cookiedLanguage = $this->Language->activeLanguageByCode($this->Cookie->read('lang'));
    $languageToRedirectTo = (!empty($cookiedLanguage['code2'])) ? cookiedLanguage['code2'] : $defaultLanguageCode;
    $newURL = '/' . $languageToRedirectTo . $this->request->here;
    $this->redirect($newURL);
}

注意:

我无法弄清楚的部分(直到在IRC中获得帮助)是使用$this->request->here构建URL,这只是URL作为字符串。在此之前,我尝试使用params数组构建数组,但没有运气。

我的路线(如果他们帮助任何人)

(请记住,我是路线菜鸟,所以 - 虽然他们似乎在为我工作,但我不保证他们做得好!)

//root URL and root URL w/ language
Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));  // eg: www.google.com takes them to pages/display/home
Router::connect('/:language', array('controller'=>'pages', 'action' => 'display', 'home'), array('language'=>'[a-z]{2}')); // eg: /en takes them to pages/display/home and sets language

//pages (eg. /en/r/the_matrix  or  /r/the_matrix)
Router::connect('/:language/r/:slug/*', array('controller'=>'pages', 'action'=>'display'), array('language'=>'[a-z]{2}', 'pass'=>array('slug')));
Router::connect('/r/:slug/*', array('controller'=>'pages', 'action'=>'display'), array('pass'=>array('slug')));

//adds language to default URL
Router::connect('/:language/:controller/:action/*', array(), array('language'=>'[a-z]{2}'));

//Route prefixes
Configure::write('Routing.prefixes', array('admin'));

//User related
Router::connect('/login', array('controller' => 'users', 'action' => 'login'));
Router::connect('/logout', array('controller' => 'users', 'action' => 'logout'));
Router::connect('/myaccount', array('controller' => 'users', 'action' => 'my_account'));

//
CakePlugin::routes();
require CAKE . 'Config' . DS . 'routes.php';

答案 2 :(得分:0)

如果您不想从控制器或视图中重定向requestAction调用,则应将以下条件添加到IF语句

    if (empty($this->request->params['language']) &&
    empty($this->request->params['admin']) && 
    empty($this->request->params['requested'])) {
    ...
    }