Video Tutorial: Eliminating Dynamic URLs with Mod_Rewrite
Get started using Mod_Rewrite to clean up your website's dynamic URLs with this video tutorial presented by Practical eCommerce's online director Brian Getting. We'll look at using simple Mod_Rewrite commands in an .htaccess file to get rid of those ugly dynamic URLs that look like this:
http://www.sample-website.com/index.php?id=435&type=ugly%20urls&why=I%20do%20not%20know
By the end of this tutorial, you'll have a better understanding of what it takes to make an ugly, dynamic URL like the one above into a clean, search engine friendly URL like this:
http://www.sample-website.com/435/nice/clean/url
We start by creating a simple PHP script that will gather variables from the URL string and output them, which will allow us to verify that our Mod_Rewrite changes are working properly. From there we move on to re-mapping URLs using Mod_Rewrite directives in our .htaccess file.
This tutorial is intended for website developers that are hosting websites on servers running Apache web server with Mod_Rewrite enabled, and access to their website's .htacess file. Please contact your hosting company for more information about your account. A basic understanding of server-side scripting and website administration is assumed.
Software Used: Adobe Dreamweaver 8
Required Server Software: Apache Web Server w/ Mod_Rewrite enabled
Sample Files: mod_rewrite_1.zip
This video tutorial requires Flash Player version 8 or above. Please forward us your ideas for additional video tutorials, via our Contact Us form.
This article is filed under Training & Education and has the following keyword tags: video, tutorial, mod_rewrite, apache, seo.
14 Comments
Legacy User says:
I was wondering, is that Dreamweaver you're using or some other HTML editor? Nice tutorial... I think people are scared of mod_rewrite but it's really not difficult and can make a huge difference in usability and search engine optimization.
-- Brandon Eley
Legacy User says:
In this particular tutorial, I am using Dreamweaver as a text editor. You could use any plain text editor, but I like to use some sort of IDE that has code highlighting and auto-indent. Another good choice (if you are on a mac) is an application called TextMate, which is also a great code editing tool.
-- Brian Getting
Legacy User says:
Hello, perfect tutorial, but I have one question, if I try www.something.com/john to rewrite on www.something.com/index.php?user=john it doesn't work. I tried anything, for example RewriteRule ^(.)$ index.php?user=$1 [nc] but it returns index.php, but i need to return john. I tryed the direct url RewriteRule ^http://www.something.com/(.)$ index.php?user=$1 [nc] but it still doesnt work. The address with www.something.com/john/ working, because I put this (.*) / to rewrite script. Please somebody to help me with the line code.
-- Filip Pavlis
Legacy User says:
Filip,
You need to put it out at least one directory, otherwise it runs through a loop where any address at your site (since they all pass the RewriteRule test) generates a call back to the index page, passing everything after your domain name along as a variable. That's why you get the output that you are getting.
Try doing something like this, which should work:
<font face="courier">RewriteRule ^users/(.*) index.php?user=$1</font>
-- Brian Getting
Legacy User says:
I've been wondering about how to do this for years, but never tried. Didn't realize how easy it could be. Great benefit to my site, thanks.
- Josh
-- Josh
Legacy User says:
this did present one problem for me. I use local values for displaying links and images in my html code. Having my urls as such:
http://www.mysite.com/view/1234
is telling the site to look for images in view/1234/images instead of /images.
Is there a simple solution for this that wont require changed the src to each image and link on my site?
-- josh
Legacy User says:
How do you include chars like _ - etc. ? I want someone mentioned in the thread before I want to create mysite.com/john.. however the only way i can use (.*) is if i have a directory /users/ .... but then people have to type /users/john to access johns profile... i want them to just have to write mysite/john it works without the users directory if i use (a-z) etc... but then if the users name has an underscore or any other chars it won work... how is this done so that you can also include _ - in the users name. thanks J
-- john
Legacy User says:
Josh- You could try the BASE HREF meta tag in your pages, but I would recommend going with images links such as "/images/yourimage.jpg" rather than "images/yourimages.jpg".
This has many advantages, and is probably the best way to do things.
-- Brian Getting
Legacy User says:
John- If your URL is something along the lines of:
/mysite/john_smith
You will want to have the value of "johnsmith" passed as a variable ($1) to the script that is accessing that information. The script should then go through and automatically replace the "" with a space (" ") using something like .gsub (for Ruby). Then the database is queried for the user's name. In most cases, as I imagine it, you will have a first name and last name column in the database, so you would actually want to split the name at the underscore, and query the database for the user with that first and last name combination.
Hope this helps some.
-- Brian Getting
Legacy User says:
We have this code working fine on a solaris server, but when we moved our site to a Linux server the redirecting doesn't work. Any ideas? Thanks
-- Julia
Legacy User says:
Brian's solution won't work as he suggested to change images src to 'images/mymage' to /images/myimage' .
For example, if my site is http://localhost/mysite and I change image src to "/images/myimage", then image src would be http://localhost/myimage instead of http://localhost/images/myimage. This also applies to style sheet,javascript.
Is there any other solution through .htacces?
-- netmastan
Legacy User says:
Oh man...nice tutorial... and all that works, but how can i make to actually work with a real website?
do i have to replace index.php for something else?
what i mean i'm only getting the:
out variables
#
The following variables were passed in the URL string:
Variable 1: $1 Variable 2: $2 Variable 3: $3 Variable 4: $3
Your mod-rewrite script seems to be working fine.
#
what is the step to make work
i tried all this rules in my .htaccess
RewriteRule ^ppc/(.*)/ index.php?var1=$1&var2=$2&var3=$3
RewriteRule ^ppc/(.*)/ index.php?ppc=$1
RewriteRule ^abc/([^/.]+)/?$ index.php?var1=$1&var2=$2&var3=$3 [L]
#
http://www.example.com/abc/index.php?var1=$1&var2=$2&var3=$3
it suppose to go to www.example.com/ppc/var/1/var2/var3 and so on
why is not working?
please some one help.
can some one help
thanks.
-- juan
Legacy User says:
Wow, nice tutorial.
Thank you so much for this. It really helps, specially for SEO and nice pretty URLs. Thanks!
-- Gab