使用Codeigniter如何重定向SEO友好的URL?

3
我正在使用CodeIgniter构建一个网站,我的URL遵循这种格式:link1其中ID(例如 123)用于查询数据库记录。

最后的URI段仅用于SEO友好目的,并且可以更改为任何内容,例如 link2

根据此答案,如何重定向所有变体的URL以显示最后一段正确的文本?

我应该在我的控制器中检查URL是否符合正确格式并在那里重定向它吗?

例如:

if($this->uri->rsegment(4, 0) !== $this->myModel->recordName) {
    redirect($id.'/'.$this->myModel->recordName);
}

感谢您的选择。

---更新1---

刚刚发现了以上方法存在的问题。有时候我会在url结尾处添加额外片段,例如链接,而此方法将无法处理这种情况。

---更新2---

以下是我的最新代码。它忽略了额外的片段,只要提供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,但那样会产生难看的URL,例如%21%40%23%40%40%21。 - fxfuture
在这种情况下,您的方法应该可以正常工作。为什么它不能处理额外的片段呢?如果您使用 $this->uri->rsegment(n) 检索URL,则它应该只返回第n个片段(记录名称),而不是第n+1个和第n+2个片段(urikey,urivalue)? - Jeemusu
我必须进行微调。现在它会忽略额外的片段 - 我更新了我的答案。 - fxfuture
1个回答

0

为什么不直接使用 $this->uri->segment(#);,其中 # 是段落编号。这种方法迄今为止从未让我们失望过。同时,我还发现一些参考资料表明 rsegment(s) 可能存在缺陷。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接