2013-07-30 52 views
3

我正在用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); 
    } 
+0

如果您已经在数据库中存储了正确的url slug(recordName),为什么不使用它来查找数据而不是id?你可以删除ID,使URL更加清晰,而且你可以在重复内容时不会遇到任何问题。 – Jeemusu

+0

谢谢Jeemusu - 与此相关的问题是我的很多记录名称都有特殊字符,我使用CI的url_title对它们进行编码。之后没有任何解码方法,因为它只是删除特殊字符。我可以使用urlencode,但然后我会有令人讨厌的网址,例如%21%40%23%40%40%21 – fxfuture

+0

在这种情况下,您的方法应该可以正常工作。为什么它不适用于额外的细分市场?如果你用'$ this-> uri-> rsegment(n)'检索url,它应该只返回段n(记录名)而不是段n + 1 n + 2(urikey,urivalue)? – Jeemusu

回答

0

为什么不使用$ this-> uri-> segment(#);其中#是段号。这还没有让我们失望。还发现了一些建议rsegment(s)可能是越野车的参考文献。