RewriteRules
Rewriterules are the heart and sole of the mod rewrite, here is where
you declare the file to be rewritten, where it is to be rewritten and
tack on any special commands.
Rewrite rules are broken down into 4 simple blocks. I'll refer to these blocks as the
Call to action, Pattern,
Rewrite and
Command Flag.
Example:
RewriteRule ^dir/([0-9]+)/?$ /index.php?id=$1 [L]
Call to action: RewriteRule
Pattern: ^dir/([0-9]+) /?$
Rewrite: /index.php?id=$1
Command Flag: [L]
Between each of these blocks of the rewrite rule there should be a
space. With that being said let's go ahead and break down each of these 4
blocks and discuss what they do.
Call to action Block
The only way to screw this up is to spell RewriteRule incorrectly or leave out the space between this and the starting of the
pattern block.
If you do spell it incorrectly you'll trigger an error and the browser
will out put a 500 error. Note if you ever see a 500 error on your site
it mostlikely due to a bad line of code in your .htaccess file.
Pattern Block
This one little piece of the mod rewrite is where the power is. In the
pattern block of the rewrite rule we use
regular expressions to detect the requested file name or uri and from this we can extract key parts to pass to the
rewrite block.
Pay attention because this is the hardest part of mod rewrite.
Regular expressions is just a method to detect letters, numbers and
symbols using special characters. These special characters are called
metacharacters.
Pattern Matching metacharacter Definitions
| Char. |
Definition |
| \ |
Use before any of the following characters to escape or null the meaning or it. \* \. \$ \+ \[ \] |
| ^ |
Start matching at this point |
| $ |
End point of the match |
| . |
Any character |
| [] |
Starts a class |
| | |
Starts alternative match this|that would mean match this or that |
| () |
starts a back reference point |
| ? |
match 0 or 1 time Quantifier |
| + |
match atleast 1 or more times Quantifier |
| * |
match 0 to infinite times Quantifier |
| {} |
match minimum to maximum Quantifier {0,3} match up to 3 times |
Class Definitions []
| Char. |
Definition |
| ^ |
Negates the class. [^A-Z]+ means don't match any uppercases |
| \ |
Use before any of the following characters to escape or null the meaning or it. [\+]+ |
| - |
Range for matching [0-9]+ [a-zA-Z]+ |
I'll show a few quick samples just so you understand how to use all of the above. Then we're going to move right on to the
Rewrite Block since we'll be going over all of this in our basic section.
In this example we just need the numbers in the ulrs below to pass
through the mod rewrite to make our query. First we have to ask
ourselves, "What is the common pattern in these urls"?
In this example there are two common patterns that we can match
against. The first one is they all start with category/. The second is
they all end in .htm. This should be an easy match
- category/1.htm
- category/56.htm
- category/092340923.htm
- category/9334.htm
So to use regular expressions to match all of these urls below we need to set our starting point to ^category/.
Now we need to tell the rewrite rule to look for any number 1 or more
times. We'll use a character class to do this [0-9]+. Since we need
this number to complete our
rewrite block we're going to tell the mod to reference this so we can use it later. We do this by surrounding the the
[0-9]+ with brachets like this ([0-9]+).
To finish the match we're going to negate the . (remember this means
any 1 character) even though a . is considered 1 character we're going
to go ahead and negate it to read as a dot and then finish the match
with htm$.
Mouse over the characters for a definition:
RewriteRule
^category/([0-9]+)\.htm$ /category.php?cat_id=$1 [L]
Another Regular Expression I recently wrote for matching letters,numbers,spaces,underscores is as follows
/(^[A-Za-z][\w\s]*)$/
Source: http://www.webforgers.net/mod-rewrite/mod-rewrite-syntax.php#quantifiers