В ответ на Sun Love код, который вы опубликовали, работает хорошо, за исключением ситуаций, когда у вас есть косая черта без расширения файла (я получаю ошибку 500), потому что первый RegEx не подходит для этой ситуации.
example.com / test.html - работает (перенаправляет на / test)
example.com / test - работает (без перенаправления)
example.com /test.html - работает (перенаправляет на / test)
example.com / test / - не работает (ошибка 500)
Возможно, существует лучший способсделать это, но я добавил еще одно условие переписывания, чтобы исправить это:
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]