在 CodeIgniter 中重新路由页面时如何防止重复内容?
Posted
技术标签:
【中文标题】在 CodeIgniter 中重新路由页面时如何防止重复内容?【英文标题】:How can I prevent duplicate content when re-routing pages in CodeIgniter? 【发布时间】:2011-03-13 06:51:10 【问题描述】:假设我有一个控制器“文章”,但我希望它显示为子文件夹(例如“博客/文章”),我可以添加这样的路由:
$route['blog/articles'] = 'articles';
$route['blog/articles/(:any)'] = 'articles/$1';
这很好用,现在唯一的问题是 example.com/articles
和 example.com/blog/articles
都使用 Articles 控制器,因此解析到相同的内容。有没有办法防止这种情况发生?
在人们不理解的情况下增加一点清晰度:
在本例中,我没有“博客”控制器,但我希望“文章”等显示在该子文件夹中(这是一个组织的东西)。 我可以有一个带有“文章”功能的博客控制器,但我可能有一堆“子控制器”并且想要分离功能(否则我最终可能会在博客控制器)。 我希望example.com/articles
返回 404,因为这不是正确的 URL,example.com/blog/articles
是。
【问题讨论】:
根据您的代码,example.com/blog/articles 使用文章控制器而不是博客控制器。 【参考方案1】:把它塞进你的控制器:
function __construct()
parent::Controller();
$this->uri->uri_segment(1) == 'blog' OR show_404();
【讨论】:
【参考方案2】:您可以在 Codeigniter 控制器中使用子文件夹,因此在 CI 中,以下目录结构有效: application/controllers/blog/articles.php 然后访问 http://example.com/blog/articles/*.
【讨论】:
【参考方案3】:如果由于某种原因,您设置了路由而不是访问文件夹中的控制器(例如,您想要一个博客控制器,但不想路由到它),您可以按照建议进行操作上面并将“博客”的测试添加到构造函数中。
如果你在 PHP5 中,你可以像这样使用构造函数:
function __construct()
parent::Controller();
$this->uri->uri_segment(1) == 'blog' OR redirect('/blog/articles');
或者,在 PHP4 中,像这样:
function Articles()
parent::Controller();
$this->uri->uri_segment(1) == 'blog' OR redirect('/blog/articles');
不过,我建议使用 redirect('blog/articles')
而不是 show_404()
,这样您就可以将点击 /articles 的用户引导到正确的位置,而不仅仅是向他们显示 404 页面。
【讨论】:
【参考方案4】:在那里路由并不意味着它将使用不同的控制器,它只是为同一个控制器创建别名 url 段。如果您希望为这些 url 段使用不同的控制器,方法是创建另一个控制器。
【讨论】:
不太清楚你的意思。我知道当我以不同方式路由它时它会使用相同的控制器(文章)。无论我创建什么控件,我仍然会遇到同样的问题 -/mycontroller
将始终转到该控制器,即使我正在使用备用路由。
"/mycontroller 将始终转到该控制器,即使我为其使用备用路由" - 不要认为这是真的。路由中的条目会拦截正常流程。【参考方案5】:
如果 /blog/ 和 /articles/ 都使用相同的控制器,您只需在路由文件中添加新规则即可将其中一个重新路由到不同的控制器。
【讨论】:
我没有使用博客控制器,我只是希望它显示为一个文件夹。另外,我不认为只是重新路由它们会起作用,我已经在重新路由但/articles
仍然调用文章控制器。以上是关于在 CodeIgniter 中重新路由页面时如何防止重复内容?的主要内容,如果未能解决你的问题,请参考以下文章
为啥/在找到页面时 CodeIgniter 在哪里设置 404 http 状态?
Codeigniter 3:不要在表单验证错误时重新加载表单