Ever wanted your page that has an ugly URL like:
/index.php?page=whatever&long=2¶meter=3
to look like /whatever/2/3?
It’s actually pretty easy and done through something called mod_rewrite.
Mod_rewrite can get pretty complicated and get into a ton of regular expressions, but for most uses, just copy and paste what I have and make any necessary changes.
Mod_rewrite goes in the .htaccess file on your server (in the main public html directory). If your server has it, edit the file, if not create one — it’s just .htaccess, nothing before the period.
Here’s the base code you’ll want to start with (but will need some modification) All of this is color coded so hopefully that helps:
RewriteEngine on
RewriteRule ^([^/]+)/?$ index.php?page=$1&%{QUERY_STRING} [L]
For example, if you want /index.php?action=anything to look like /anything what you’ll need is:
RewriteEngine on
RewriteRule ^([^/]+)/?$ index.php?action=$1&%{QUERY_STRING} [L]
The above code will make /login essentially cloak /index.php?action=login, /register will load/cloak /index.php?action=register etc…
If you only want /login to go to /index.php?action=login and not have it happen for /anything you would want something like this (no wildcard):
RewriteEngine on
RewriteRule ^login/?$ index.php?action=login&%{QUERY_STRING} [L]
You can also do this for multiple parameters, so to go back to that first example of making /index.php?page=whatever&num1=7&num2=6 look like /whatever/7/6 you would want to use:
RewriteEngine on
RewriteRule ^([^/]+)/([0-9]+)/([0-9]+)/?$ index.php?page=$1&num1=$2&num2=$3&%{QUERY_STRING} [L]
- Here’s a bit of an explanation of what that all means…Starting at the 2nd line, the rule is it’s searching the URL (when someone visits a page on your site) for ([^/]+) which is any combination of characters/numbers *except* a forward slash. The + means it must match at least one character.
- ([0-9]+) Looks for any number
- /?$
- The / looks for a forward slash
- The ? means that forward slash is optional (if it’s there it works if it’s not it still works)
- $ means it’s at the end of the URL. So it matches for http://anything.com/anything/ and http://anything.com/anything, but not http://anything.com/anything/somethingelse.
- After the space is the URL it will load once there is a match
- $1 is a wildcard for the first contents of parenthesis, so it refers back to (^/) and what it stood for. In this case it stood for “whatever“
- $2 is a wildcard for the 2nd set of parenthesis, $3 for the third and so on.
- %{QUERY_STRING} just allows extra stuff to be put on the end so if I did /whatever/7/6/?test=test it would pass the test parameter as well.
Want to get into some more advanced mod_rewrite? Here’s a nice little cheat sheet. If you have questions, post them in the comments.