Clean URLs with mod_rewrite


Using the mod_rewrite module you can link to a URL that has a concise name. For example rather than linking to tutorials.php?id=PHP you can link to tutorials/PHP.

.htaccess file

First, create a file and save it as .htaccess. Put this file in the directory you want the URL rewriting to take place (e.g. the main directory for the web site).

RewriteEngine On

Add the text above to the first line of the file to enable the URL rewriting.

Specifying rules

Next you can specify the rewrite rules using regular expressions. An example is below:

RewriteEngine On
RewriteRule ^tutorials/([^/\.]+)/?$ tutorials.php?id=$1 [L]

The example above means that a link to tutorials/PHP/ will load the document tutorials.php?id=PHP. The [L] flag means that the server will stop looking for rewrite rules once it has found one that matches. The $1 refers to the text found in the search, in the example above PHP.

RewriteEngine On
RewriteRule ^tutorials/([^/\.]+)/?$ tutorials.php?id=$1 [L]
RewriteRule ^downloads/([^/\.]+)/?$ downloads.php?id=$1 [L]

The example above means that a link to downloads/my-download/ loads the document downloads.php?id=my-download.

Regular expressions

In the example above the regular expression [^/\.]+ is used. This expression matches text that does not contain a forward slash or a full stop. This is needed as we want to catch the text after the tutorials/ and downloads/ folder.

Absolute URI’s

The example above changes the URL tutorials.php?id=PHP into tutorials/PHP/ which means that the files path is inside a directory it was not before. This means that any relative links in the document will not work. To solve this the HTML base element can be used inside the HEAD tag.

<base href="" />

The base element resolves any relative link to the base URL.

<base href="" />
<link href="main.css" rel="stylesheet" type="text/css" />
//The CSS file above will load from
The base element resolves all URI’s in the document including hyperlinks which means all URI’s need to be relative to the base URI.

Apache notes

For .htaccess files to work they need to be enabled in the servers .conf file:

Further Reading



No tags