Eliminando .php de ejemplo.com/.php

Eliminando .php de ejemplo.com/.php

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.comporque terminan siendo example.com/.php. Entonces, ¿cómo puedo solucionar eso?

Respuesta1

Necesitas:

  • Compruebe que el archivo de destino (con la .phpextensió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 RewriteConddirectiva 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 NCbandera. Y no hay necesidad de escapar de la barra en elRewriteRule patrón.

Supongo que también debe tener una RewriteBasedirectiva definida en otra parte de su archivo; de lo contrario, esto probablemente resultará en una redirección no válida en el archivo .htaccess.

información relacionada