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){
。我明白了。我只是想用这个有用的提示来奖励我的答案,谢谢:)