I want to make the pages on my site more search engine friendly by turning the query strings into meaningful looking page names.

For example I have a page that is this:


I want it to look like this:


Sometimes there is a second query string so it would need to work with just one or both. For example:


Should look like


Here's what I've tried so far but I can't get it to work.

RewriteRule ^search.php?c\=(.*)* /doctors/general-$1 [NC,R=301,L]
RewriteRule ^doctors/[^?/]*-(\d+)\ /search.php?c=$1&s=$2 [QSA

Thanks so much for your help,


2 Answers 2


try this:

RewriteEngine On
RewriteRule ^doctors\/[\w\-]+\-(\d+)\/?$ search.php?c=$1 [L,QSA]
RewriteRule ^doctors\/[\w\-]+\-(\d+)\/[\w\-]+\-(\d+)\/?$ search.php?c=$1&s=$2 [L,QSA]
  • Hey thanks That worked great. But what if someone types in /search.php?s=523, can I make it automatically redirect them to:/doctors/Cardiology-112/
    – Will
    Commented Feb 25, 2012 at 17:07
  • It works really well. But what if the category name has 2 parts like this: /doctors/arthritis-specialists-111/ Some could even have 3 or 4 words as part of the category name. For SEO reasons I'd like to have the name separated by a dash.
    – Will
    Commented Feb 25, 2012 at 17:26
  • I've edited the regexp to also include the dashes, so you can put as many words as you want. and the answer to your first comment - yes you can, but you shouldn't - friendly url does not suppose to work in that direction... and it also can't "guess" the category's name in the htaccess - if you want it to happen - you need to write it inside your search.php
    – Yaron U.
    Commented Feb 25, 2012 at 19:44

Add this to your .htaccess file residing in your DocumentRoot.

RewriteEngine On
RewriteBase /

#To prevent Looping
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

#To redirect the converted URL to actual URL
RewriteRule ^doctors/MainCategoryName-(\d+)/$ serach.php?c=$1 [L]

RewriteRule ^doctors/MainCategoryName-(\d+)/SubCatrogyrName-(\d+)/$ serach.php?c=$1&s=$2 [L]

#To convert your URL
RewriteCond %{QUERY_STRING} ^c=(\d+)$ [NC]
RewriteRule ^serach.php /doctors/MainCategoryName-%1/? [L,R=301]

RewriteCond %{QUERY_STRING} ^c=(\d+)&s=(\d+)$ [NC]
RewriteRule ^serach.php /doctors/MainCategoryName-%1/SubCatrogyrName-%2/? [L,R=301]
  • using RewriteCond %{ENV:REDIRECT_STATUS} 200 is very dangerous, because even if the URL is a redirection, you still may want to apply rewrite rules. If I were you I would avoid such thing. Maybe, to avoid loop, before a "potential looping rule", test if the status is not 200: RewriteCond %{ENV:REDIRECT_STATUS} !200 Commented Feb 27, 2012 at 14:43
  • @OlivierPons Ya I agree! But, I use it with care. Like you said, only when rules are not required to be applied again. Commented Feb 27, 2012 at 15:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.