back to the cotton

Thursday, July 2, 2009

Using ReWriteRules to Improve SEO on a Tshirt Site

I was recently told by my SEO expert that my web site would rank higher for my search terms (Tshirts, Nerds, Recession, etc.) if the keywords appeared in my URLs.

I already had a categorical hierarchy, but was handling all my pages with one php file, section.php, which only needed a Printfection product or section ID to generate an entire page of relevant content and which sat in the root directory.

She suggested that my links, which then looked like this:

http://www.oncepressed.com/section.php?sectionid=293441

Would be much better regarded by search engines if they looked like this:

http://www.oncepressed.com/Tshirts/Clothe-The-Nerds/Back-In-Black



Getting this to work required a twofold approach.

1) I would need some help adding rewrite RewriteRules to my Apache configuration ...

and ...

2) I would need to change section.php to accept titles OR productIds as arguments.

You may have noticed, even as a casual web user, that more and more sites show paths rather than x.html or x.php files in the broswer's URL window these days. In the past, the only way to hide a script in a directory was to make it the index file. RewriteRules not only let you use different files as index was used in the past, but they will create the appearance of directories in your site where there are none.

The rewrite rules for my site (as written by my expert) look like this:

RewriteEngine on
RewriteRule ^/Tshirts/[^/]+/(.*) /section.php?section_name=$1
RewriteRule ^/Tshirts/(.*) /section.php?section_name=$1

This can be read simply as:

If a URL is presented to Apache, and it starts with /Tshirts, take the last field separated by slashes and pass it to section.php as a new argument called section_name.

The RewriteRules were done.

Next, I took on the PHP portion of the challenge by making section.php friendly to section_name OR section_id. At first I thought I would need a hard-coded look-up table at the beginning of my code to convert names to IDs. Then I had a better idea.

I wasn't currently using the "Teaser" field associated with each product in Printfection's API, so I decided that I would put it to use as way to do a name_to_id lookup in the MySql-esque Printfection database. I revisitied each of my products and sections and gave them a carefully chosen look-up-name in the Teaser field. This look-up-name would become the path to that product. See screenshot for clarification.

It seems that search engines also prefer that words be separated by dashes or underscores so as to read them separately, so I went with Citizens-Of-The-Word, rather than CitizensOfTheWord, my preferred method.

After adding the look-up-name to the teaser field and writing a lookup_id_by_teaser function which called the Printfection database, I had my ID and could leave most of the rest of the code untouched.

Any link code had to be revisited and converted to something like:

<?php
echo '<a href="'.$product_array->teaser.'">'.$product_array->name.'</a>';
?>


It was a bit more complicated than this, because, I also had to remember what my current hierarchy was before building the proper link, but by using the $_SERVER["REQUEST_URI"] variable to determine my current level -- this was a tool I did not have at my disposal before, I was thrilled that the browser was actually going to help me remember where I was -- I was able to solve this problem too.

In summary:

* RewriteRules are powerful tools for the SEO element of your site as well as ease of readability.

* I was reasonably happy with my final solution, but was unhappy to lose my Teaser field. Although I wasn't using it, I know others do and I may want to again some day. I played briefly with imbedding the look-up-name in a <!-- comment --> in the teaser field, but the inability of the API to query by wildcards prevented this.

Anyone else have an idea, short of using the Teaser field? I'd love to hear it.

See the new URLs in action: www.oncepressed.com

thanks,

-matt

Labels: , ,


Read more!