
Tengo un sitio web en Wordpress. Quiero redirigir las URL .php a aquellas que no tienen el sufijo .php. El .htaccess es el siguiente:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)\.php$ "$1" [R=301,L,NC]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Pero cuando visitohttps://www.ejemplo.com/alguna página.php, la página no se puede mostrar. El siguiente error se muestra en el navegador:
The page isn’t redirecting properly
An error occurred during a connection to www.example.com.
This problem can sometimes be caused by disabling or refusing to accept cookies.
Y la URL en la barra de direcciones se convierte https://www.ejemplo.com/index.
Si cambio la regla de reescritura como:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)\.html$ "$1" [R=301,L,NC]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Y visitahttps://www.ejemplo.com/alguna página.html, se redirige exitosamente ahttps://www.ejemplo.com/alguna páginay la página web se muestra normalmente. ¿Por qué?
Respuesta1
Porque, dado que la redirección esincondicional, terminas redirigiendo de nuevodespuésla URL se ha reescrito index.php
(el controlador frontal de WordPress).
Cuando usted solicita /somepage.php
:
- Serás redirigido a
/somepage
(según la primera regla). La respuesta de redireccionamiento se envía de vuelta al cliente. - En la segunda solicitud, la última regla
/somepage
la reescribe internamente ./index.php
El motor de reescritura luego comienza de nuevo (en undirectoriocontexto)... /index.php
es redirigido a/index
(según la primera regla). La respuesta de redireccionamiento se envía de vuelta al cliente.- En la tercera solicitud, la última reescritura
/index
se reescribe internamente ./index.php
El motor de reescritura luego comienza de nuevo... - Ir a 3 (atascado en un bucle de redireccionamiento sin fin).
en undirectoriocontexto (como .htaccess
) el motor de reescritura no realiza simplemente una sola pasada por el script. Se repite hasta que la URL pasa sin cambios. (A menos que utilice la END
bandera en Apache 2.4 o se produzca una redirección 3xx externa).
Cambiar para eliminar .html
funciona bien porque está reescribiendo en /index.php
, que no termina en .html
, por lo que la directiva de redireccionamiento (que elimina .html
) no coincide.
Para resolver esto, debe evitar redirigir la solicitud reescrita. Puedes hacer esto mediante:
usando la
END
bandera (Apache 2.4+) en la última reescritura, en lugar deL
evitar más bucles del motor de reescritura. Aunque debes evitar cambiar las directivas estándar de WordPress (ver más abajo), es posible que esta no sea la opción preferida. Esto tampoco funciona en Apache 2.2.O verifique la
.php
extensión conTHE_REQUEST
la variable del servidor (que contiene la línea inicial de los encabezados de la solicitud HTTP y no cambia cuando se reescribe la solicitud). Por ejemplo:# Remove ".php" extension on "direct" (not rewritten) requests only RewriteCond %{THE_REQUEST} [A-Z]{3,7}\s/[^?]+\.php(?:\?|\s|$) [NC] RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
O verifique la
REDIRECT_STATUS
variable de entorno, que está vacía en la solicitud inicial y configurada en 200 (como en el estado HTTP 200 OK) en la primera reescritura exitosa (esto es más simple que la expresión regular bastante más compleja anterior). Por ejemplo:# Remove ".php" extension on "direct" (not rewritten) requests only RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
Sin embargo, no debe editar el código dentro de la # BEGIN WordPress
sección, ya que WordPress intenta mantenerlo y puede sobrescribirlo más adelante. Esta regla debe desaparecerantesel # BEGIN WordPress
marcador de comentarios. No es necesario repetir la RewriteEngine On
directiva que aparece más adelante en el archivo (en la sección de WordPress).
Deberá borrar la memoria caché de su navegador antes de realizar la prueba, ya que es probable que el navegador haya almacenado en caché la redirección errónea (permanente). Pruebe primero con redireccionamientos 301 (temporales) para evitar problemas de almacenamiento en caché.
Sin embargo, esto por sí solo no le permite acceder .php
a archivos sin la .php
extensión. Dado que la URL sin extensión deberá reescribirse internamente en el .php
archivo.