Estamos migrando un sitio web a nuestra infraestructura cPanel. El cliente alojó el sitio web en su propia infraestructura utilizando Nginx. Nos envió sus archivos de configuración de Nginx y los convertimos a reglas de Apache Rewrite. El resultado final (que muestra sólo las líneas relevantes) se ve así:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ouvidoria/$ /ouvidoria/index.php
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]
Todo funciona como se esperaba, excepto una página, que es /ouvidoria
. Esta página específica tiene un directorio con el mismo nombre en public_html, por lo que RewriteRule apunta al ouvidoria/index.php
archivo. El problema es que por algún motivo cuando accedemos a la /ouvidoria
URL nos redirigen /ouvidoria/?id=ouvidoria
, lo que parece caer en la penúltima regla. Éste es entonces el primer problema a resolver.
La segunda es que podemos acceder a la URL con una barra diagonal ( /ouvidoria/
) y no se agregará ?id=ouvidoria
, pero el sitio web se desarrolló de manera que el menú lateral se cargue de acuerdo con la URL. Sólo se cargará sin una barra diagonal. Incluso si eliminamos la regla problemática del primer problema (que no es una solución, porque es necesaria en otras páginas), redirige /ouvidoria
a /ouvidoria/
, por lo que no se puede cargar el menú.
Se agradecerá cualquier ayuda sobre cómo hacer que estas reglas funcionen.
EDITAR:
El único problema que queda es la redirección de /ouvidoria
a /ouvidoria/
. Captura de pantalla de la pestaña Red:
Detalles de redireccionamiento:
Respuesta1
Respuesta actualizada para solucionar el problema de "redireccionamiento al subdirectorio". Pruebe el siguiente conjunto de directivas:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]
Al eliminar RewriteCond %{REQUEST_FILENAME} !-d
, Apache no comprueba si existe un directorio con el recurso solicitado. Esto podría ayudar con su problema.
Respuesta original:
Ha pasado un tiempo desde que trabajé con las reglas de Apache, pero creo que el siguiente cambio lo ayudaría a lograr su objetivo:
Reemplazar
RewriteRule ^ouvidoria/$ /ouvidoria/index.php
con
RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]
La versión original de la regla solo coincide con /ouvidoria/
el URI. Por lo tanto, la solicitud llega al segundo RewriteRule
, lo que provoca un comportamiento como el que usted describió.
La versión fija de la regla coincide con /ouvidoria/
y /ouvidoria
.
Respuesta2
Bueno, por alguna razón la directiva DirectorySlash Off
ahora funcionó. Ya intenté configurarlo antes, pero generaría un error 500. He reescrito esas reglas muchas veces, tal vez eliminé lo que entraba en conflicto con DirectorySlash y ahora esa directiva está funcionando como se esperaba.
También gracias a @Tero Kilkanen por ayudarme a solucionar el primer problema.