1

I have tried lots of URL rewrite rules in .htaccess but I am stuck now. I have to change this URL:

    products.php?id=31

to

    products/31

I have used:

    Options +FollowSymLinks -MultiViews
    # Turn mod_rewrite on
    RewriteEngine On
    RewriteBase /

    ## don't touch /forum URIs
    RewriteRule ^forums/ - [L,NC]

    RewriteCond %{THE_REQUEST} \s/+products(?:\.php)?\?id=([0-9]+) [NC]
    RewriteRule ^ products/%1? [R,L]

    RewriteRule ^products/([0-9]+)/?$ products.php?id=$1 [L,QSA]

    ## hide .php extension snippet
    # To externally redirect /dir/foo.php to /dir/foo
    RewriteCond %{THE_REQUEST} \s([^.]+)\.php [NC]
    RewriteRule ^ %1 [R,L]

    # To internally forward /dir/foo to /dir/foo.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^(.+?)/?$ $1.php [L]

Using this I get the following result:

  products/31

But all images and CSS not displaying. Any ideas?

2
  • Are you using relative URLs to your images / CSS files?
    – MrWhite
    Dec 23, 2013 at 10:40
  • You have lots of rewrite rules that look like they should do the same thing. Figure out which one is the one that is actually working. I suspect you only need the forum rewrite rule and this one: RewriteRule ^products/([0-9]+)/?$ products.php?id=$1 [L,QSA] The duplicate rules should be removed so you can understand what is happening. Dec 23, 2013 at 10:49

3 Answers 3

2

Try this:

RewriteRule ^(.*)\/$ $1.php [NC]
0
2

Try this:

RewriteEngine on
RewriteRule ^(.*) $1 [L]
RewriteRule ^products/$ products.php?id=31 [L]

This code working fine for me. For more details: http://www.askapache.com/htaccess/htaccess.html

1

about the images and CSS not displaying; If your URL gets rewritten to something like products/31 keep in mind that relative links inside the html are now relative to products/ even though the php script itself sits in the root. Because the html gets interpreted by the browser and the browser thinks you are in the products/ folder. You can use absolute urls (starting with http://hostname/ or just relative to root, thus starting with /) or have them rewritten too.

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