CakePHP友好的搜索引擎优化url

CakePHP友好的搜索引擎优化url,php,cakephp,url-routing,friendly-url,Php,Cakephp,Url Routing,Friendly Url,我想让我的网址搜索引擎优化友好www.example.com/posts/view/1更改www.example.pl/:slug-:id。一切正常,但我可能在路由方面出了问题,因为在paginator中单击url后,url是正确的,看起来像www.example.pl/:slug-:id,但它似乎是一个错误 “在此服务器上找不到请求的地址“www.example.pl/:slug-:id”。 我不知道怎么了。这是我的密码: Router::connect( '/:slug-:id',

我想让我的网址搜索引擎优化友好
www.example.com/posts/view/1
更改
www.example.pl/:slug-:id
。一切正常,但我可能在路由方面出了问题,因为在paginator中单击url后,url是正确的,看起来像
www.example.pl/:slug-:id
,但它似乎是一个错误

“在此服务器上找不到请求的地址“www.example.pl/:slug-:id”。

我不知道怎么了。这是我的密码:

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

echo $this->Html->link($ad['Post']['title'], array(
    'controller' => 'posts',
    'action' => 'view',
    'slug' => Inflector::slug($post['Post']['title'],'-'),
    'id'=>$post['Post']['id'])
);
我解决了这个问题

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

可能是路线上的正则表达式有问题。您的slug包含连字符
-
,您也可以使用它来分隔slug和id。例如:

example.com/my-slug-has-hyphens-1
正则表达式不够聪明,无法知道“最后”连字符将slug与id分开


若要测试这是否是问题所在,请尝试使用如下路径:“/:slug\uuuu:id',,看看它是否有效。

太简单了,我将从我的项目中为您提供一个示例。。 在您的routes.php中

Router::connect(
    '/:slug-:id',
    array('controller'=>'posts','action'=>'view'),
    array('pass'=>array('slug','id'),'slug'=>'[a-zA-Z0-9 -]+','id'=>'[0-9]+')
);
public function view($slug,$id){
    $this->Post->id = $id;
    // ....
}
您在视图中的链接应该是这样的

$this->Html->link(__('link desu'),array('controller'=>'posts','action'=>'view','id'=>$post['Post']['id'],'slug'=>$post['Post']['slug']));
以及您的PostsController.php

Router::connect(
    '/:slug-:id',
    array('controller'=>'posts','action'=>'view'),
    array('pass'=>array('slug','id'),'slug'=>'[a-zA-Z0-9 -]+','id'=>'[0-9]+')
);
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']);
通行证对订单敏感 问题中的路线如下:

Router::connect(
    '/:slug-:id',
    array(
        'controller' => 'posts', 
        'action' => 'view'
    ),
    array(
        'pass' => array('slug' , 'id'), # <-
        'id' => '[0-9]+'
    )
);
如编辑的问题所示,代码希望id是第一个参数。最简单的解决方案是按照预期的顺序指定传递的参数:

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

“pass'=>数组('id','slug'),#我解决了这个问题。在posts控制器中,我的查看功能出错。这是正确的:

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

+谢谢你回答自己的问题。请注意,代码没有错,只是与路由定义不匹配。这是一个合理的猜测,但贪婪的正则表达式不是这样工作的-没有限制,slug将只是字符串“my slug has hyphens”。我建议在回答之前尝试一下你的建议。-1因为这会改变问题以匹配答案-它不会回答问题。+1虽然“快速提示”会分散实际答案的注意力。为什么,只是为了避免创建那些大数组(有时)每次你想得到你的URL时,记住你在回答一个问题:你的答案有一半以上与问题无关-现在知道问题(见作者的答案)唯一一行(singlular,1)真正解决问题的是:
public function view($slug,$id){
。我明白了。我只是想用这个有用的提示来奖励我的答案,谢谢:)