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

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 is not the correct URL, example.com/blog/articles is.

Answers


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.


Need Your Help

car moving body in box2d with cocos2d-x

ios iphone box2d cocos2d-x physics

i have car body and 2 tiers as seprate images .

Disabling and changing style of individual listview items with custom adapter in Android

android listview custom-adapter

I have a listview that is being populated by information from a database using a custom adapter to handle the individual views. What I am trying to do is disable certain items in that listview (it ...