How to: Clean username URL's in CodeIgniter

How to: Clean username URL's in CodeIgniter

When most people start work on this, they think about using routes. You could do it this way, but then every time you enter a url such as http://example.com/controller then router would send the controller name off to check if it is a username. It's possible you could do a database check and send it back, but that is just annoying.

Another way is hooks, but I am not a fan of over-using hooks as they can create invisible code which confuses other developers.

The way I like to do this is to add a URL suffix in the config file (meaning add .html or similar to the end of all your pages) then anything with only 1 URI segment that does not have a suffix, is a username.

Step 1: Edit application/config/config.php and set the following config setting:

/*
 |--------------------------------------------------------------------------
 | URL suffix
 |--------------------------------------------------------------------------
 |
 | This option allows you to add a suffix to all URLs generated by CodeIgniter.
 | For more information please see the user guide:
 |
 | http://codeigniter.com/user_guide/general/urls.html
 */
 $config['url_suffix'] = ".html";

Step 2: Add/edit your .htaccess file and add the highlighted rule:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /

# -- Add this rule ---
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9_-]+)$
RewriteRule ^(.*)$ index.php/profiles/view/$1 [L]
# End of rule 

# Standard CodeIgniter rule
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

That is basically a standard CI .htaccess with an extra rule in it. Any URI segment 1 with a-z, 0-9, - or _ in it which does not have a URL suffix will go to a controller which will take the username and show the correct profile.

If you have mod_proxy enabled you could even swap the flag [L] with [L,P] to make the URL stay as http://example.com/username.