我正在用codeigniter建立一个网站,我的网址遵循以下格式:http://www.mywebsite.com/123/name-of-the-record其中id等123用于查询数据库中的记录。用Codeigniter重定向SEO友好的网址?
最后一个uri细分仅用于SEO友好目的,可以更改为任何内容 - 例如http://www.mywebsite.com/123/i-can-write-anything-here
继续从这个答案,https://stackoverflow.com/a/1442130/864507,我如何重定向所有变化的网址,以显示正确的文本在最后一段?
我应该检查url是我的控制器中正确的格式并将其重定向到那里?
例如
if($this->uri->rsegment(4, 0) !== $this->myModel->recordName) {
redirect($id.'/'.$this->myModel->recordName);
}
感谢
--- UPDATE1 ---
刚刚发现上述方法的问题。有时我会在网址末尾添加额外的细分受众群,例如http://www.mywebsite.com/123/name-of-the-record/urikey/urivalue - 这样就不会与
--- UPDATE2 ---
这是我最新的代码工作。这会忽略额外的细分,并且只要提供了id就可以工作。希望有人能确认这是否是正确的/最好的方式来做到这一点!
$correctRecordName = myEncodeForUrlFunction($this->myModel->recordName);
$rsegments = $this->uri->rsegment_array();
if(count($rsegments) < 4 || $rsegments[4] !== $correctRecordName) {
$rsegments[4] = $correctRecordName;
$url = site_url($rsegments);
redirect($url, 'location', 301);
}
如果您已经在数据库中存储了正确的url slug(recordName),为什么不使用它来查找数据而不是id?你可以删除ID,使URL更加清晰,而且你可以在重复内容时不会遇到任何问题。 – Jeemusu
谢谢Jeemusu - 与此相关的问题是我的很多记录名称都有特殊字符,我使用CI的url_title对它们进行编码。之后没有任何解码方法,因为它只是删除特殊字符。我可以使用urlencode,但然后我会有令人讨厌的网址,例如%21%40%23%40%40%21 – fxfuture
在这种情况下,您的方法应该可以正常工作。为什么它不适用于额外的细分市场?如果你用'$ this-> uri-> rsegment(n)'检索url,它应该只返回段n(记录名)而不是段n + 1 n + 2(urikey,urivalue)? – Jeemusu