CakePHP友好的seo网址

时间:2013-12-26 14:22:25

标签: php cakephp url-routing friendly-url

我想让我的网址友好。 www.example.com/posts/view/1的{​​{1}}更改。一切正常,但可能我在路由方面做错了,因为在点击paginator中的url后,url是正确的,它看起来像www.example.pl/:slug-:id,但是它出现了错误

www.example.pl/:slug-:id

我不知道出了什么问题。这是我的代码:

"The requested address 'www.example.pl/:slug-:id' was not found on this server."

在paginator视图中:

Router::connect(
    '/:slug-:id',
    array(
        'controller' => 'posts', 
        'action' => 'view'
    ),
    array(
        'pass' => array('slug' , 'id'),
        'id' => '[0-9]+'
    )
);

我解决了这个问题。

5 个答案:

答案 0 :(得分:4)

它太简单了我会给你一个我项目的例子.. 在 routes.php

Router::connect(
    '/:slug-:id',
    array('controller'=>'posts','action'=>'view'),
    array('pass'=>array('slug','id'),'slug'=>'[a-zA-Z0-9 -]+','id'=>'[0-9]+')
);

观看次数中的链接应该是这样的。

$this->Html->link(__('link desu'),array('controller'=>'posts','action'=>'view','id'=>$post['Post']['id'],'slug'=>$post['Post']['slug']));

和您的 PostsController.php

public function view($slug,$id){
    $this->Post->id = $id;
    // ....
}

快速提示:尝试在PostModel中创建一个数组,以避免每次在视图中创建它。 例如:

Post.php

class Post extends AppModel{
    // ....
        public function afterFind($results,$primary = false){
        foreach ($results as $key => $value) {
            if(isset($value[$this->alias]['id'])){
                $results[$key][$this->alias]['url'] = array(
                                 'controller'=>'posts',
                                 'action'=>'view',
                                 'id'=>$results[$key][$this->alias]['id'],
                                 'slug'=>$results[$key][$this->alias]['slug']
                            );  
            }
            // ....
        }
        return $results;
    }
}

}

所以你可以像你那样在你的视图中调用它

$this->Html->link(__('link desu'),$post['Post']['url']);

答案 1 :(得分:2)

路线上的正则表达式可能存在问题。你的slug包含连字符-,你也用它来分隔slug和id。即:

example.com/my-slug-has-hyphens-1

正则表达式不够智能,不知道“最后”连字符将slug与id分开。

要测试这是否是问题,请尝试使用此'/:slug__:id',之类的路线,看它是否有效。

答案 2 :(得分:1)

我解决了这个问题。在帖子控制器中我的视图功能是错误的。这是正确的:

function view($id = null, $slug = null) {
$this->Post->id = $this->params['post'];
$this->set('post', $this->Post->read());

答案 3 :(得分:0)

通行证是订单敏感的

在问题中,路线如下:

Router::connect(
    '/:slug-:id',
    array(
        'controller' => 'posts', 
        'action' => 'view'
    ),
    array(
        'pass' => array('slug' , 'id'), # <-
        'id' => '[0-9]+'
    )
);

这意味着post函数将会收到:

public function view($slug, $id)

如编辑问题所示,代码期望id成为第一个参数。最简单的解决方案就是按照预期的顺序指定传递的参数:

...
        'pass' => array('id', 'slug'), # <-

答案 4 :(得分:-1)

Router::connect(
    '/:slug/:id',
    array(
        'controller' => 'posts', 
        'action' => 'view'
    ),
    array(
        'pass' => array('slug' , 'id'),
        'id' => '[0-9]+'
    )
);

以上代码将创建正确的链接,如www.example.com/posts/view/title/1

echo $this->Html->link($post['Post']['title'], array('controller' => 'posts', 'action' => 'view', Inflector::slug($post['Post']['title'],'-'),$post['Post']['id']));