& ldquo; Dynamic & rdquo; rewrite with mod_rewrite and apache


I´ve a bit of a "strategic" problem with creating a nice mod_rewrite solution for a shop. The shop has different kind of pages:

  • Products (products.php)
  • Categories (category.php)
  • Content (content.php)

So the "default" URI´s look like this:

  • /products.php?id=2
  • /category.php?id=4
  • /content.php?id=5

The final result should be a URI´s that include the name of the page (product name, category name).

  • /chocholate-icecream -> product.php?id=2
  • /coffe-and-ice -> category.php?id=4
  • /imprint -> content.php?id=5

My problem now is, that I´ve different types of content which maps to different .php files. And I´m unable to determine to which .php file to route with mod_rewrite as long as I don´t use a cheat "like **/product/**chocolate-icrecream" so that I know that this URI is made for a product. But me and my customer don´t want that solution.

I´ve already started another try:

  • ALL requests which don´t match a physical file or folder are routed to a mapper.php file. This file looks in the database - I´ve an index with all products, categories etc. - and gives me the correct file.
  • The mapper then loads the content via CURL and shows it to the user

Basically I thought this was a nice idea but there are so many problems with session handling, , post data, php based redirects (header: ...) with CURL that I really plan to cancel this way etc. etc.

So my question is: Has anyone of you an idea or a pattern that helps me creating the "good looking" URI´s without using a complex CURL mapper?

Thanks a lot in advance, Mike

UPDATE to "Include solution":

A good example for the "include problem": A request for www.shop.com/cart is "rewritten" to "mapper.php". The "mapper.php" decides to include www.shop.com/shoppingcart.php.

shoppingcart.php uses smarty to display the cart. The view asks the $_SERVER variable, if the actual called file is "shoppingcart.php" to decide if the page should be shown in fullscreen mode or with additional columns.

In the "normal / direct" call $_SERVER['PHP_SELF'] would be "/shopping_cart.php" which will show the fullscreen version. Going over the mapper.php with the include option would give us $_SERVER['PHP_SELF']=='/mapper.php' which will give us the view with columns (what´s wrong).

You could do this simply by pointing them all to one page and then including the proper script based on the slug. For example, rewrite all requests like index.php?slug=chocolate-icrecream.


$resource = fetch_resource($slug);
if ($resource->slug == 'product')
else if ($resource->type == 'category')

I don't understand why you don't want to structure your URLs like /product/chocolate-icrecream. That would be good semantic naming that is fairly consistent across the internet nowadays.