I originally wanted to have all my urls end with no extension. Unfortunately, I've tried many htaccess codes and I've just about given up.
So now I want to make it so if a person wants to visit a page in my site, but forgets to enter .php, he/she wi开发者_开发技巧ll automatically be redirected to the same url but with the .php
How can this be done? Thanks!
Here are the rules:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]
It will check if requested resource is not a existing folder. For example: you requesting
http://www.example.com/help
. If there is such folder present (/help
) the rule will do nothing (priority is given to a folder). If you do not want this behaviour then remove the first line.It will check if there is such .php file before rewriting. For example: you requesting
http://www.example.com/aboutus
but there is NOaboutus.php
file there -- no rewrite will occur.All such requests should be without trailing slash: should be
http://www.example.com/aboutus
and NOThttp://www.example.com/aboutus/
The rule will work for URL in subfolders as well: e.g.
http://www.example.com/pages/help/aboutus
will be rewritten just fine.Because of the above checks the rule will not enter into a rewrite loop (no 500 error on this rule)
Query string (page parameters) will be preserved
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]
## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
In response to Sun Love, the code you posted works well except for situations where you have a trailing slash without the file extension (I get a 500 error) because the first RegEx doesn't match for this situation.
example.com/test.html -- works (redirects to /test)
example.com/test -- works (no redirect)
example.com/test.html -- works (redirects to /test)
example.com/test/ -- doesn't work (500 error)
There is probably a better way to do this but I added another rewrite condition to fix this:
RewriteEngine on
Options +FollowSymLinks -MultiViews
RewriteBase /
## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+).php
RewriteRule ^ %1 [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)/\s
RewriteRule ^ %1 [R=301,L]
## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
Try this .htaccess:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^([^\.]+)$ $1.php [L]
EDIT: ^([^\.]+)$ $1.php [L]
精彩评论