Solución:
He usado esto:
RewriteEngine On
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://example.com/folder/$1 [R=301,L]
# Redirect external .php requests to extensionless URL
RewriteCond %{THE_REQUEST} ^(.+).php([#?][^ ]*)? HTTP/
RewriteRule ^(.+).php$ http://example.com/folder/$1 [R=301,L]
# Resolve .php file for extensionless PHP URLs
RewriteRule ^([^/.]+)$ $1.php [L]
Ver también: esta pregunta
La otra opción para usar scripts PHP sin extensión es
Options +MultiViews
O incluso simplemente siguiendo en los directorios .htaccess
:
DefaultType application/x-httpd-php
Este último permite tener todos los nombres de archivo sin extensión. script
siendo tratados como scripts PHP. Si bien MultiViews hace que el servidor web busque alternativas, cuando solo se proporciona el nombre de base (sin embargo, hay un impacto en el rendimiento).
1) ¿Está seguro de que el módulo mod_rewrite está habilitado? Cheque phpinfo()
2) La regla anterior asume que la URL comienza con “carpeta”. ¿Es esto correcto? ¿Realmente deseaba tener una carpeta en la URL? Esto coincidiría con una URL como:
/folder/thing -> /folder/thing.php
Si realmente quieres
/thing -> /folder/thing.php
Debe eliminar la carpeta de la expresión de coincidencia.
Normalmente uso esto para enrutar la solicitud a la página sin php (pero la tuya debería funcionar, lo que me lleva a pensar que es posible que mod_rewrite no esté habilitado):
RewriteRule ^([^/.]+)/?$ $1.php [L,QSA]
3) Suponiendo que está declarando sus reglas en un archivo .htaccess, ¿su instalación permite la configuración de opciones (AllowOverride) anulaciones en archivos .htaccess? Algunos hosts compartidos no lo hacen.
Cuando el servidor encuentra un archivo .htaccess (como lo especifica AccessFileName), necesita saber qué directivas declaradas en ese archivo pueden anular la información de acceso anterior.