i'm trying to rewrite some simple urls:
http://www.site.com/folder/index.php?page=something
into
http://www.site.com/folder/something
here's my .htaccess file ( placed in /folder/ )
RewriteEngine On
RewriteBase /folder
RewriteRule ^(.*)$ index.php?page=$1 [R]
with this rule i always get this URL
http://www.site.com/folder/index.php?page=index.php
what am i doing wrong?
First, change
RewriteBase /folder
to
RewriteBase /folder/
Second, change
RewriteRule ^(.*)$ index.php?page=$1 [R]
to
RewriteRule ^index\.php/(.*)$ index.php?page=$1 [L,QSA]
That should work. The QSA part is to allow any querystring in the address to be carried over to the new address; otherwise, they will be dropped.
In that case, try this
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
similar to what you had earlier.
Unless you have other patterns, that should achieve what you need
Hope it helps.
You are referencing the wrong match, use $2
like so
RewriteEngine On
RewriteBase /folder
RewriteRule ^(.*)$ index.php?page=$2 [R]
The above is infact incorrect. It seems that the .
is not matching the correct characters (I don't know why).
The best way I can see getting round this without knowing the cause of the issue is to simply match letters and numbers like so:
# Turn on the rewrite engine
RewriteEngine On
# Set the rewrites for /folder
RewriteBase /folder
# Set the rewrite rules
RewriteRule ^([a-z0-9]+)/?$ index.php?page=$1 [NC]
If I may suggest, please look into a generator for htaccess, such as: http://www.generateit.net/mod-rewrite/
which gives you:
RewriteEngine On
RewriteRule ^folder/([^/]*)$ /folder/index.php?page=$1 [L]
I've editted the above, this is a working example on a local testdomain. Perhaps this is just what you have been looking for.
Also, if I may, omitting the extension of a page is not recommendable. Google likes it to be recognizable e.g. .html or .php.
And, you should add a rewriterule for every parameter you add.
Finally, I would omit the index.php. Your server will automatically load index.php if no other page is found, but it doesn't have to be visible in the addressbar.
Your initial rule worked perfectly. The only problem was the [R] modifier which redirected /folder/something to /folder/index.php?page=something and caused a second request.
Apply your rule on /folder/index.php?page=something and you get /folder/index.php?page=index.php
To fix this replace [R] ( HTTP 302 Redirect ) by [L] ( leave matching chain when you match here ) and you're done
Thanks to everyone i succeeded in doing what i was thinking to do:
RewriteEngine On
RewriteBase /folder/
#Excluding direct url to php files
RewriteCond %{REQUEST_URI} !(.*)\.php$
#Excluding the empty space url
RewriteCond %{REQUEST_URI} !^(\s*)$
RewriteCond %{REQUEST_URI} !\.(gif|jpg|png|css|js|)$ [NC]
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]