Para eliminar solo .php de mis URL, actualmente tengo lo siguiente
# Remove trailing slashes
RewriteRule ^(.*)\/$ $1 [NC,L,R=301]
# Remove trailing .php extensions
RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC]
RewriteRule ^ %1/%2 [L,R=301]
# Add .php extension for final internal redirect
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule !\.php$ %1.php [NC,L]
Pero estas reglas no funcionan example.com
porque terminan siendo example.com/.php
. Entonces, ¿cómo puedo solucionar eso?
Respuesta1
Necesitas:
- Compruebe que el archivo de destino (con la
.php
extensión) existaantesreescritura internamente - Evite reescribir directorios (para los cuales la raíz del documento es una).
- Evite reescribir únicamente la raíz del documento (como en su ejemplo).
Por ejemplo, para evitar reescribir únicamente la raíz del documento, como en su ejemplo específico, puede modificar la RewriteCond
directiva existente:
# Add .php extension for final internal redirect RewriteCond %{REQUEST_URI} ^(.*)$
leer:
RewriteCond %{REQUEST_URI} ^(/.+)$
/.+
coincide con una barra seguida dealgo, lo que excluiría la raíz del documento, ya que la raíz del documento es naturalmente una barra diagonal en sí misma.
Para evitar reescribir todos los directorios (de los cuales uno es la raíz del documento), puede agregar una condición adicional para evitar reescribir las URL que se asignan a un directorio físico. Por ejemplo:
RewriteCond %{REQUEST_URI} ^(/.+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.php$ %1.php [NC,L]
Sin embargo, si tiene directorios a los que se puede acceder, entonces debe modificar su regla existente que elimina las barras diagonales; de lo contrario, probablemente obtendrá un bucle de redireccionamiento al solicitar un directorio (ya que mod_dir agregará una barra diagonal de forma predeterminada). Por ejemplo:
# Remove trailing slashes RewriteRule ^(.*)\/$ $1 [NC,L,R=301]
Debe modificarse para incluir la misma condición anterior:
# Remove trailing slashes, unless the request maps to a directory
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [L,R=301]
Además, aquí no es necesaria la NC
bandera. Y no hay necesidad de escapar de la barra en elRewriteRule
patrón.
Supongo que también debe tener una RewriteBase
directiva definida en otra parte de su archivo; de lo contrario, esto probablemente resultará en una redirección no válida en el archivo .htaccess
.