Conflicto de RewriteRule y barra diagonal

Conflicto de RewriteRule y barra diagonal

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.phparchivo. El problema es que por algún motivo cuando accedemos a la /ouvidoriaURL 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 /ouvidoriaa /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 /ouvidoriaa /ouvidoria/. Captura de pantalla de la pestaña Red:

Pestaña Red

Detalles de redireccionamiento:

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 Offahora 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.

información relacionada