CakePHP路由多语言博客与规范链接

时间:2014-07-22 17:48:26

标签: php cakephp routes seo canonical-link

我在CakePHP网站上设置了以下路线

Router::connect('/:language/blog', array('controller' => 'posts', 'action' => 'index'), array('language' => 'en', 'persist'=>array('language')));

Router::connect('/:language/blogue', array('controller' => 'posts', 'action' => 'index'), array('language' => 'fr', 'persist'=>array('language')));

Router::connect('/:language/blog/:post_id', array('controller' => 'posts', 'action' => 'view'), array('language' => 'en', 'persist'=>array('language', 'post_id')));

Router::connect('/:language/blog/:post_id/:slug', array('controller' => 'posts', 'action' => 'view'), array('language' => 'en', 'persist'=>array('language', 'post_id', 'slug')));

Router::connect('/:language/blogue/:post_id', array('controller' => 'posts', 'action' => 'view'), array('language' => 'fr', 'persist'=>array('language', 'post_id')));

Router::connect('/:language/blogue/:post_id/:slug', array('controller' => 'posts', 'action' => 'view'), array('language' => 'fr', 'persist'=>array('language', 'post_id', 'slug')));

这为我提供了/en/blog/fr/blogue这样的网址。有没有办法可以删除该网址,并将其显示在/blog/blogue中(但是仍然坚持语言参数)?

如果不可能,我可能会将语言保留在网址中,但下一步非常重要。我的<head>

中有类似的内容
echo '<link rel="canonical" href="'. Router::url($this->request->here true) .'">';

我希望在其中包含SEO的规范网址。我希望规范网址只是/blog/123,但它始终显示为当前网址的所有内容。 /en/blog/123/article-slug/fr/blogue/123/article-slug。有谁知道我怎么能得到理想的行为? (附带问题:从规范网址中删除slug部分是否会破坏使用友好URL进行SEO的目的?)

2 个答案:

答案 0 :(得分:0)

我通过改变路线来解决这个问题

Router::connect('/blog', array('controller' => 'posts', 'action' => 'index', 'language'=>'en'), array('persist'=>array('language')));
Router::connect('/blog/:post_id', array('controller' => 'posts', 'action' => 'view', 'language'=>'en'), array('persist'=>array('language', 'post_id')));
Router::connect('/blog/:post_id/:slug', array('controller' => 'posts', 'action' => 'view', 'language'=>'en'), array('persist'=>array('language', 'post_id', 'slug')));

Router::connect('/blogue', array('controller' => 'posts', 'action' => 'index', 'language'=>'fr'), array('persist'=>array('language')));
Router::connect('/blogue/:post_id', array('controller' => 'posts', 'action' => 'view', 'language'=>'fr'), array('persist'=>array('language', 'post_id')));
Router::connect('/blogue/:post_id/:slug', array('controller' => 'posts', 'action' => 'view', 'language'=>'fr'), array('persist'=>array('language', 'post_id', 'slug')));

并在我的帖子控制器中查看了我添加的操作

$this->set('canonical', Router::url(array('controller'=>'posts', 'action'=>'view', 'post_id'=>$post['Post']['id'], 'language'=>'en')));

在我的布局文件的<head>部分,我添加了

if (!isset($canonical)) {
    $canonical = $this->request->here;
}
if ($canonical !== false) {
    echo '<link rel="canonical" href="'. Router::url($canonical, true) .'">';
}

答案 1 :(得分:-1)

如何删除:language并为每个设置?:

Router::connect('/blogue/:post_id/:slug',
    array('controller' => 'posts', 'action' => 'view'),
    array('language' => 'fr', 'persist'=>array('post_id', 'slug')));

Router::connect('/blog/:post_id/:slug',
    array('controller' => 'posts', 'action' => 'view'),
    array('language' => 'en', 'persist'=>array('post_id', 'slug')));