I really enjoy power behind Clean URLs in Drupal CMS. It allows me instead of "http://www.example.com/node/123" path to have nice URL like "http://www.example.com/blog/nice-seo-friendly-urls-in-catalyst-application". And most important I can change this nice url to whatever I want or need.
I found it is quite easy to implement something similar for Catalyst application.
I store url aliases in table url_aliases (url_alias_id, internal_url, external_url). Where internal_url - Catalyst internal action path, external URL - everything you see in address bar after http://www.example.com/
In my default action in Root.pm (which normally shows 404 error page) I added few lines of code:
my $url_alias = $c->model('DB::UrlAlias')->search({ external_url => $c->req->path })->single; if ($url_alias) { $c->go( '/'. $url_alias->internal_url ); }
And here is my MyApp::Schema::Result::UrlAlias result class for a reference:
package MyApp::Schema::Result::UrlAlias; use strict; use warnings; use base 'DBIx::Class::Core'; __PACKAGE__->table("url_aliases"); __PACKAGE__->add_columns( "url_alias_id", { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, "internal_url", { data_type => "varchar", size => 1024, is_nullable => 0 }, "external_url", { data_type => "varchar", size => 1024, is_nullable => 0 }, ); __PACKAGE__->set_primary_key("url_alias_id");
Now you can add something like this into DB:
INSERT INTO (url_alias_id, internal_url, external_url) VALUES (1, 'index', 'homepage');
And you should be able to access your /index action via http://www.example.com/homepage URL.
Next would be to add caching to eliminate repetitive requests to DB, add secondary indexes for internal_url and external_url fields and add some UI to edit these settings.. But overall it was very easy. :)