所有
我目前正在使用CakePHP彻底改造我当前的新闻网站。我已经或将要将所有当前文章转移到我的新网站,它们将与当前网站具有相同的article_id
。但是,我已经意识到以下问题。
我当前的网站使用以下设置作为网址:
http://www.mydomain.com/?c=140&a=4388
c=
引用类别ID,a=
引用文章ID。我的新设置(CakePHP)我利用了slugs,现在我的文章URL显示为:
http://www.mydomain.com/noticia/this-is-an-article-slug
因为,我注意到,通过webstats,我的许多文章都通过Facebook等其他网站上设置的链接进行访问,我认为创建一个能够解决这个问题的系统/路线至关重要。
这就是我的想法:
a
值作为参数传递给我的文章控制器中的重定向功能,例如articleRedirect($article_id)
然后,此函数将根据传递的slug
在数据库中查找$article_id
并重定向到新地址(请参阅下面的函数)
// Function in articles controller to redirect old site's article url to
// new websites url format
function articleRedirect($article_id = NULL){
$this->Article->recursive = -1;
$slug = $this->Article->findById($article_id);
if($slug == NULL){
$this->Session->setFlash('Article not found');
$this->redirect('/noticias');
}else{
$this->redirect('/noticia/'.$slug['Article']['slug']);
}
}
我认为这应该有效。但是,我需要一些严肃的路由帮助。任何人都可以建议我可以使用的路线。
非常感谢。
答案 0 :(得分:3)
最简单的方法是重新建模您的网址以保留文章ID。例如:
http://www.example.com/noticia/4388/this-is-an-article-slug
然后你可以创建1个单独的RewriteRule来重写所有旧URL到这个新结构,并使用1 Route将它们路由到你的控制器的动作。这样,只需2行配置即可将旧URL迁移到新URL。您的路线看起来像这样:
Router::connect(
'/noticia/:article-id/:slug',
array('controller' => 'noticias', 'action' => 'view'),
array('pass' => 'article-id'),
'article-id' => '[0-9]+'
);
这会调用NoticiasController
的查看操作,并将文章ID从URL传递给它。您必须添加到.htaccess中的RewriteRule应该看起来像这样(未经测试,但只是为了给你一个指针):
RewriteRule ^/?c=[0-9]+&a=([0-9]+)$ /noticia/$1/
答案 1 :(得分:0)
感谢Oldskool愿意提供帮助。但是,我在实施它时遇到了麻烦。我决定远离使用.htaccess或路由,并选择在app_controller中实现一个函数,它将为我处理它:
在我的app_controller's
beforeFilter()
中,我添加了以下内容:
//Check old url style as in http://www.bravanews.com/?c=123&a=2345 for redirection
//to the correct new url style as in http://www.bravanews.com/noticia/news-title-using-slug
$this->CheckOldUrl();
然后在我的app_controller.php
中创建了以下函数:
function CheckOldUrl(){
preg_match("/\?c=(\w+)\&a=(\w+)/i", $_SERVER['REQUEST_URI'], $matches);
if(!$matches == NULL){
$this->redirect('/noticias/articleRedirect/'.$matches[2]);
}
}
如果旧的url上面的函数将转移到articleRedirect函数,然后该函数将重定向到正确的文档
// Function in articles controller to redirect old site's article url to
// new websites url format
function articleRedirect($article_id = NULL){
$this->Article->recursive = -1;
$slug = $this->Article->findById($article_id);
if($slug == NULL){
$this->Session->setFlash('Article not found');
$this->redirect('/noticias');
}else{
$this->redirect('/noticia/'.$slug['Article']['slug']);
}
}
这可能不是以这种方式处理此类事情的最佳方式,因为它每次访问我的网站时都会调用该函数,但它对我没有任何重大问题。