簡體   English   中英

CakePHP友好的seo網址

[英]CakePHP friendly seo url

我想讓我的網址友好。 www.example.com/posts/view/1更改為www.example.pl/:slug-:id 一切正常,但可能我在路由方面做錯了,因為在點擊paginator中的url后,url是正確的,它看起來像www.example.pl/:slug-:id ,但是它出現了錯誤

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

我不知道出了什么問題。 這是我的代碼:

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

我解決了這個問題。

它太簡單了,我會在你的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']);

這可能是路線上正則表達式的一個問題。 你的slug包含連字符-你也可以用它來分隔slu and和id。 即:

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

正則表達式不夠聰明,不知道“最后”連字符將slug與id分開。

要測試這是否是問題,請嘗試使用類似'/:slug__:id',的路由,看它是否有效。

我解決了這個問題。 在帖子控制器中我的視圖功能是錯誤的。 這是正確的:

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

通行證對訂單敏感

在問題中路線如下:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM