【问题标题】:CakePHP routing multilingual blog with canonical links带有规范链接的 CakePHP 路由多语言博客
【发布时间】:2014-07-22 17:48:25
【问题描述】:

我在我的 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 这样的 URL 有没有办法从 URL 中删除语言并让它只显示 /blog/blogue(但仍然保留语言参数)?

如果这不可能,我可能会接受将语言保留在 url 中,但是下一点非常重要。我的<head> 中有这样的东西

echo '<link rel="canonical" href="'. Router::url($this->request->here true) .'">';

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

【问题讨论】:

标签: php cakephp routes seo canonical-link


【解决方案1】:

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

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')));

在我添加的布局文件的 &lt;head&gt; 部分中

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

【讨论】:

【解决方案2】:

如果只是删除: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')));

【讨论】:

  • 如果我删除 :language 部分,那么它根本不会进行任何语言切换并且与反向路由不匹配(​​我的链接自动包含语言参数)
猜你喜欢
  • 2013-12-19
  • 2011-04-12
  • 1970-01-01
  • 2012-02-22
  • 2015-09-30
  • 1970-01-01
  • 2013-02-15
  • 2020-10-19
  • 2015-06-04
相关资源
最近更新 更多