I've been trying to wrap my head around .htaccess for most of the weekend, but I keep stumbling; I can get the server to work with one set of rules, but no more than one at a time.

My application is made up of several pages:

  • The Homepage pulls in content from the Detail page, (as well as content that the Detail page doesn't include), with an optional query string argument; e.g. ?s=item-name
  • The Detail page pulls in content with an optional query string argument (the same argument as the homepage; e.g. ?s=item-name - this would refer to exactly the same content)
  • A Collection page
  • A Related page

Each of these pages is a php file in the document root (index.php, detail.php, collection.php, related php).

What I would like to achieve:

  • The user should be able to go to mydomain.com/detail/ or mydomain.com/detail (so allow trailing slashes) instead of mydomain.com/details.php
  • If present, the query string argument (?s=item-name) should be entered after the page's trailing slash (so mydomain.com/item-name instead of mydomain.com/?s=item-name; mydomain.com/detail/item-name instead of mydomain.com/detail.php?s=item-name. This would be the case for all pages, so setting the rule on one page at a time seems rather cumbersome...

This is what my .htaccess file looks like at present, after much fiddling:

<IfModule mod_rewrite.c>  
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?s=$1 [L]

This allows the homepage to pull in the correct content, and I'm sure it's not too far off allowing any page to do the same, but I can't quite fathom it.

Can anyone help?


You could extract the first part of the URL, and us it to test if it matches one of your php scripts, like this:

RewriteCond $1.php              -f
RewriteRule ^([^/]+)/(.*)       $1.php?s=$2
  • Not working I'm afraid... with or without the trailing slash, I get a file not found error. – MassivePenguin May 6 '13 at 12:52
  • My example was a suggestion that you could work from. In order to make it work in your case the best thing to do is enable rewritelog, so you can see what is going on. If you get a "file not found" it could be that it is rewriting... – Krist van Besien May 6 '13 at 14:42

Someone was able to answer the question over at Stack Overflow:


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.