Howto mod_rewrite with Apache Published: Apr 29, 2004
  • Rating


Create search engine friendly URLs with Apache mod_rewrite which rewrites requested URLs on the fly. It supports an unlimited number of rules making it perfect for dynamic web sites.

About mod_rewrite for Apache

This module uses a rule-based rewriting engine (based on a regular-expression parser) to rewrite requested URLs on the fly. It supports an unlimited number of rules and an unlimited number of attached rule conditions for each rule to provide a really flexible and powerful URL manipulation mechanism. The URL manipulations can depend on various tests, for instance server variables, environment variables, HTTP headers, time stamps and even external database lookups in various formats can be used to achieve a really granular URL matching.

This module operates on the full URLs (including the path-info part) both in per-server context (httpd.conf) and per-directory context (.htaccess) and can even generate query-string parts on result. The rewritten result can lead to internal sub-processing, external request redirection or even to an internal proxy throughput.

But all this functionality and flexibility has its drawback: complexity. So don't expect to understand this entire module in just one day.

Using Apache's mod_rewrite

The Apache module mod_rewrite can be used to perform various forms of URI acrobatic manipulation. A prerequisite concept before attempting to understand mod_rewrite are regular expressions.

When a URL is requested by a server, this does not necessarily map directly to the server's filesystem. This request can be twisted and turned to (hopefully) present more sense to the browsing user.

Why should I care?
A clean URL is part of a good user experience. It works as a breadcrumb trail - allowing the user to see where they are located in the site, it doesn't break in bookmarks, you can easily send it over email, and allows users to guess where they want to go next. Most importantly a easy to read URL will be indexed by search engines such as Google. Having all your pages indexed creates a huge advantage to getting visitors to your website. Many search engine robots cannot read a URL with symbols such as ? & or commas and therefor not indexing your website.

This is all possible by using human-readable URLs:

"In principle, users should not need to know about URLs which are a machine-level addressing scheme. In practice, users often go to websites or individual pages through mechanisms that involve exposure to raw URLs." -- Jakob Neilsen, Jakob Nielsen's Alertbox, March 21, 1999: URL as UI

"a URL should contain human-readable directory and file names that reflect the nature of the information space." -- Jakob Nielsen, item #4 Top Ten Mistakes in Web Design

By choosing a well thought-out URL, you won't have to change it during the next re-organization. URLs that remain the same tend to pick up more links over time.

Getting started:
First, Apache must be compiled with the mod_rewrite module for any of this to take place. Insert these lines into the vhost definition for the domain that you want to work with.

RewriteEngine on
RewriteLog /path/to/logs/server.rewrite.txt
RewriteLogLevel 1

The first line turns the RewriteEngine on. Otherwise, extra code doesn't get processed by the Apache webserver. Next, we specify where the logfile that records the rewrite activity should be placed. This is mostly for debugging, as your CustomLog should be keeping track of traffic.
A beginning example:
One of the simplest uses of mod_rewrite is to re-direct a web request from one page to another. Many times this will be done if the first has expired, was spelled wrong, or the site has a new naming scheme. It's nice to forward new users to the correct page in case they have the previous one bookmarked, or if a search engine has cached the old location.

RewriteRule ^/biogarphy.php3 /biography/ [R=301]

This forwards a browser request from one page to the other. because the [R=301] at the end. I've taken a file that was spelled wrong, and fixed it at the same time removing a an old filetype suffix. (php4 has replaced that suffix with .php) What if I were to dump php from my system, and go with *.html, *.jsp, or even *.willie? By rewriting my URI to look like a directory, it doesn't matter what filetype I'm using, nor what my DirectoryIndex options are.

Compound Example:
What if you used the above example, but didn't decide to create a "biography" directory at your Doc-root? Apache can still be told where the content resides by including another RewriteRule following the first. Rules will continue attempting to match until a "last" case is presented with the [L] modifier at the end. This is much like a switch programming structure, using break to prevent each option from being executed.

RewriteRule ^/biography/ /biogarphy.php3 [L]

This might seem a little redundant, since we just did the opposite. This line will tell requests to "biography" to read the content from /biogarphy.php3 instead of looking for a biography directory. Confusing? Well, I could do this instead:

RewriteRule ^/(.+)/?$ /content/$1.php [L]

I can search on anything that follows the beginning slash, and replace the file request to look for that file in the content directory through the use of the regular expression and the backreference.

I've also placed this inside another directory that I don't necessarily want the browsing user to see, or know about, but it's easier for the webmaster to keep track of the roles of each file on the site. Since I've upgraded from php3 to php4 the suffix has changed. 
More Advanced - the Query String:
The query string is passed in separately from the URL. This means that a simple regex doesn't necessarily do the trick, but a compound statement using RewriteCond (condition) is required.

RewriteCond %{QUERY_STRING} id=([^&;]*)
RewriteRule ^/$ http://%{SERVER_NAME}/%1/? [R]
RewriteRule ^/([^\/]*)/?$ /index.php?id=$1 [L]

The RewriteCondition matches only when the following condition is true, and continues until a "last" [L] is stated. The Condition's backreferences are different, using the % prefix, and their scope lasts beyond the Condition line.

This above example would translate "/?id=home" into "/home/", and then re-assign the value of "home" to the id HTTP_GET_VAR. One more thing to notice here is that the the second line has a trailing ? - this is used to negate copying of the query string into the new, re-directed URI.
More Reference Links:


  • Rating


Related Articles

Comments (24)

  • Gravatar - Boby
    Boby 15:35, July 27, 2006
    Your site is very interesting and useful
  • Gravatar - Ronny
    Ronny 06:13, July 28, 2006
    Wow. This site is great. I have no words to said more than thanx.
  • Gravatar - Genry
    Genry 11:28, July 28, 2006
    This site simply ideal. Success in work!
  • Gravatar - Eric
    Eric 02:31, July 29, 2006
    Very cool design! Useful information. Go on!
  • Gravatar - Nike
    Nike 07:38, July 29, 2006
    Very interesting website. Keep up the outstanding work and thank you...
  • Gravatar - Boby
    Boby 18:56, July 29, 2006
    Hi, all. Nice site...I really like your site ! Good job man.
  • Gravatar - Amanda
    Amanda 02:14, July 30, 2006
    Oh o ho! very nice site!
  • Gravatar - Bill
    Bill 14:42, July 30, 2006
    Cool guestbook, interesting information... Keep it UP. excellent site i really like your stuff.
  • Gravatar - Bill
    Bill 03:45, July 31, 2006
    i love this site.
  • Gravatar - Mike
    Mike 11:28, August 2, 2006
    A fantastic site, and brilliant effort. A great piece of work.
  • Gravatar - Katie
    Katie 01:02, September 26, 2006
    I'm love this great website. Many thanks guyd
  • Gravatar - Joon
    Joon 14:26, October 28, 2006
    Pretty nice site, wants to see much more on it! :)i
  • Gravatar - yashjimmy
    yashjimmy 16:12, July 9, 2010
    Hi, I am working on the rewritemap and rewriterule for my website. actually requirement is like i have one website whose address is now since i am going to retire this website so i need to redirect most of the pages to new website. i want to use map file for this. i have created this mapping file where i want to keep maping like /folder1/page1.html in this way i want to use the redirection. i dont want to hardcode the each redirect rule. I can have /folder2/page1.html also. Could you please help me to have the correct rule.
  • Gravatar - boroPadloro
    boroPadloro 19:01, May 24, 2011
    <a href="">xbox live account</a> xbox auction
    <a href="">xbox 360 emulator for vista</a> xbox 360 ethernet port not working
    <a href="">xbox 360 storage tower</a> xbox forums banning
    <a href="">xbox live msn</a> sony ps3 release dates
    <a href="">xbox 360 sales on black friday</a> fantasy final ps3 trailer vii
    <a href=>xbox 360 ps3 controller</a> xbox live mlg bio
    <a href=>xbox bio art crown</a> xbox 360 value bundle
    <a href=>es language ps3 warcraft world</a> xbox live no credit card
    <a href=>xbox component cables</a> xbox unreadable disc fix
    <a href=>xbox controller on pc driver</a> ps3 blue tooth wireless controller xbox 360 ubuntu media center xbox developers xbox lg competition xbox customer care india xbox 360 elite modern warfare 2 bundle walmart
  • Gravatar - boroPadloro
    boroPadloro 21:31, May 24, 2011
    <a href="">xbox country rock band</a> xbox 360 game reviews top
    <a href="">sky player on xbox lags</a> xbox 360 cheap console
    <a href="">xbox 360 usb hard drive hack</a> xbox 360 repaired or replaced
    <a href="">xbox 360 jasper chipset and how to spot it</a> xboxaddict
    <a href="">xbox bio art tut</a> xbox live your nat type
    <a href=>xbox 360 kodu</a> xbox guy game
    <a href=>xbox 360 oblivion cheats codes</a> xbox hotswapping
    <a href=>xbox live contact number ireland</a> xbox magazine with disc
    <a href=>xbox american idol song list</a> xbox 360 unreadable disc fix
    <a href=>xbox 360tm universal media remote</a> xbox birthday cards xbox names ideas flashed xbox 360 for sale xbox 360 xtractor xbox dos attack xbox 360 cases and mods
  • Gravatar - boroPadloro
    boroPadloro 22:32, May 25, 2011
    <a href="">xboxchile</a> xbox live 30 day trial
    <a href="">xbox live finder</a> xbox sky player
    <a href="">ps3 killzone</a> xbox 360 ddr mat
    <a href="">red dead redemption xbox 360 console</a> xbox game show
    <a href="">xbox 360 sbk</a> xbox 360 bios copy and paste
    <a href=>xbox network adapter not working</a> xbox thinks game is dvd
    <a href=>xbox live leaderboards modern warfare 2</a> xbox live buy games
    <a href=>xbox live price hike</a> xbox 360 save editors benutzen
    <a href=>xbox 360 smack talk</a> xbox iphone music
    <a href=>xbox live people search</a> xbox audio adapter cable xbox 360 fear 2 walkthrough ps3 lobby xbox 360 mods xbox how to delete a profile xbox usb hard drive
  • Gravatar - boroPadloro
    boroPadloro 01:06, May 26, 2011
    <a href="">xbox live gold membership free</a> xboxworld360
    <a href="">xbox 360 slogan</a> xbox 360 elite boxing day
    <a href="">xbox live games</a> xbox live strict nat fix
    <a href=""> m8</a> xbox 360 hulu
    <a href="">xbox controller on pc driver</a> sign in
    <a href=>xbox docking station</a> xbox 360 specs compared to ps3 specs
    <a href=>xbox emulation</a> xbox bio copy and paste
    <a href=>xbox 360 hard drive transfer disc with pc</a> xbox crossover cable diagram
    <a href=>xbox controller mod tutorial</a> final fantasy vii ps3 tech demo
    <a href=>xbox button font</a> xbox dvd player problems xbox heatsink demolition derby xbox 360 xbox adapter flashing green light xbox 360 hard drive 20gb price it language magic magic might might ps3
  • Gravatar - boroPadloro
    boroPadloro 03:50, May 26, 2011
    <a href="">xbox 360 logo freeze</a> xbox 360 games future shop
    <a href="">xbox 360 hard drive upgrade transfer</a> xbox 360 racing games best
    <a href=""> modern warfare 2</a> best xbox kids games
    <a href="">xbox 360 os on pc</a> xbox l360
    <a href="">ps3 cell chips</a> xbox live stats
    <a href=>xbox flashing orange</a> xbox joypad
    <a href=>xbox 360 bio copy and paste</a> xbox cover art
    <a href=>xbox 360 delete profile</a> xbox 360 game saves transfer
    <a href=>xbox jack size</a> what is a xbox lag switch
    <a href=>xbox heatsink kit</a> xbox controller pc modern warfare 2 xbox 360 elite game bundle xbox 360 nxe metal ps3 twisted ps3 madden video xbox 360 xcm black light case
  • Gravatar - boroPadloro
    boroPadloro 06:43, May 26, 2011
    <a href="">xbox 360 rf switch</a> xbox 360 dvi
    <a href="">soft modding xbox 360 elite</a> xbox cheap games
    <a href="">xbox adapter flashing green light</a> xbox 360 deals target
    <a href="">xbox ireland support number</a> xbox specifications
    <a href="">xbox 360 sales on black friday</a> ps3 news and pics
    <a href=>xbox 360 elite power supply wattage</a>
    <a href=>xbox keeps shutting off</a> xbox 360 clans
    <a href=> in australia xbox 360</a> xbox 360 game saves site
    <a href=>xbox 360 bundles costco</a> xbox 360 shooter games
    <a href=>xbox parts sale</a> xbox 360 driving games xbox controller drivers credit https3a2f2freview trans u xbox live mac laptop xbox 360 games on itouch xbox forums call of duty
  • Gravatar - camDilmimputt
    camDilmimputt 08:07, June 1, 2011
    free download soft web
    [email protected]

Add Your Thoughts is a hosting directory, not a web host.

Copyright © 1998-2024