开发者

How can I prevent duplicate content when re-routing pages in CodeIgniter?

开发者 https://www.devze.com 2023-01-05 23:15 出处:网络
Say I have a controller, \"Articles\" but I want it to appear as a sub-folder (e.g. \"blog/articles\"), I can add a route like this:

Say I have a controller, "Articles" but I want it to appear as a sub-folder (e.g. "blog/articles"), I can add a route like this:

$route['blog/articles'] = 'articles';
$route['blog/articles/(:any)'] = 'articles/$1';

This works fine, the only problem now is that example.com/articles and example.com/blog/articles both use the Articles controller and thus resolve to the same content. Is there a way to prevent this?

To add a little more clarity in case people aren't understanding:

  • In this example, I don't have a 'blog' controller, but I want 'articles' etc to appear to be in that subfolder (it's an organization thing).
  • I could have a blog controller with an 'articles' function, but I'm likely to have a bunch of 'subcontrollers' and want to separate the functionality (otherwise I could end up with 30+ functions for separate entities in the blog controller).
  • I want example.com/articles to return a 404 since that i开发者_如何学Cs not the correct URL, example.com/blog/articles is.


Shove this in your controller:

function __construct()
{
    parent::Controller();

    $this->uri->uri_segment(1) == 'blog' OR show_404();
}


You can use subfolders in Codeigniter controllers, so in CI, the following directory structure works: application/controllers/blog/articles.php and is then accessed at http://example.com/blog/articles/*.


If, for some reason, you're set on routing instead of accessing the controllers in folders (you want to have a blog controller, for example, and don't want to route to it), you can do as suggested above and add the test for 'blog' to the constructor.

If you're in PHP5, you can use the constructor function like this:

function __construct()
{
    parent::Controller();
    $this->uri->uri_segment(1) == 'blog' OR redirect('/blog/articles');
}

or, in PHP4, like this:

function Articles()
{
    parent::Controller();
    $this->uri->uri_segment(1) == 'blog' OR redirect('/blog/articles');
}

I would suggest using redirect('blog/articles') instead of show_404(), though, so that you're directing users who hit /articles to the correct location, instead of just showing them a 404 page.


Routing there does not mean it will use a different controller, it just creates alias url segment to same controller. The way will be to create another controller if you are looking to use a different controller for those url segments.


If both /blog/ and /articles/ use the same controller, you can reroute one of them to a different one by just adding a new rule in your routes file.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号