【问题标题】:CakePHP friendly seo urlCakePHP 友好的 seo 网址
【发布时间】:2014-01-14 04:52:04
【问题描述】:

我想让我的 url 对 seo 友好。 www.example.com/posts/view/1 更改为 www.example.pl/:slug-:id。一切正常,但可能是我在路由方面做错了,因为在分页器中点击 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]+'
    )
);

在分页器视图中:

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

我解决了这个问题。

【问题讨论】:

    标签: php cakephp url-routing friendly-url


    【解决方案1】:

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

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

    views 中的链接应该是 .

    $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 虽然“快速提示”会分散实际答案的注意力。
    • 怎么来的,它只是为了避免每次你想得到你的网址时创建那些大数组(有时)
    • 记住你在回答一个问题:超过一半的答案与问题无关 - 现在知道问题(参见作者的回答),唯一真正解决问题的行(单数,1)是这个:public function view($slug,$id){.
    • 我明白了。只是想用这个有用的提示给我的答案加分,无论如何谢谢:)
    【解决方案2】:

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

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

    正则表达式不够聪明,无法知道“最后一个”连字符将 slug 与 id 分开。

    要测试这是否是问题所在,请尝试使用类似 '/:slug__:id', 这样的路由,看看它是否有效。

    【讨论】:

    • 这是一个合理的猜测,但这不是贪婪的正则表达式的工作方式——没有限制,slug 只是字符串'my-slug-has-hyphens'。我建议您在回答之前尝试您的建议。
    【解决方案3】:

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

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

    【讨论】:

    • +1 用于回答您自己的问题。请注意,代码没有错,只是与路由定义不匹配。
    【解决方案4】:

    通行证对订单敏感

    问题中路线如下:

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

    【讨论】:

      【解决方案5】:
      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']));
      

      【讨论】:

      • -1 因为这会更改问题以匹配答案 - 它不回答问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2011-07-23
      • 2011-04-06
      • 2017-05-14
      • 2014-07-26
      • 2011-02-15
      • 2020-05-09
      相关资源
      最近更新 更多