Conflito de RewriteRule e barra final

Conflito de RewriteRule e barra final

Estamos migrando um site para nossa infraestrutura cPanel. O cliente hospedou o site em infraestrutura própria utilizando Nginx. Ele nos enviou seus arquivos de configuração Nginx e nós os convertemos para regras do Apache Rewrite. O resultado final (mostrando apenas as linhas relevantes) fica assim:

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]

Tudo funciona como esperado, exceto uma página, que é /ouvidoria. Esta página específica possui um diretório com o mesmo nome em public_html, portanto o RewriteRule aponta para o ouvidoria/index.phparquivo. O problema é que por algum motivo quando acessamos a /ouvidoriaURL somos redirecionados para /ouvidoria/?id=ouvidoria, o que parece estar caindo na penúltima regra. Portanto, este é o primeiro problema a ser resolvido.

A segunda é que podemos acessar a URL com uma barra final ( /ouvidoria/) e ela não será anexada ?id=ouvidoria, mas o site foi desenvolvido de forma que o menu lateral seja carregado de acordo com a URL. Ele só será carregado sem uma barra final. Mesmo que retiremos a regra problemática do primeiro problema (o que não é uma solução, pois é necessária em outras páginas), ela redireciona /ouvidoriapara /ouvidoria/, não conseguindo carregar o menu.

Qualquer ajuda sobre como fazer essas regras funcionarem será apreciada.

EDITAR:

O único problema que resta é o redirecionamento de /ouvidoriapara /ouvidoria/. Captura de tela da guia Rede:

Guia Rede

Detalhes de redirecionamento:

Detalhes de redirecionamento

Responder1

Resposta atualizada para resolver o problema de "redirecionar para subdiretório". Experimente o seguinte conjunto de diretivas:

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]

Ao remover o RewriteCond %{REQUEST_FILENAME} !-d, o Apache não verifica se existe um diretório com o recurso solicitado. Isso pode ajudar com o seu problema.


Resposta original:

Já faz um tempo que não trabalho com as regras do Apache, mas acho que a seguinte mudança ajudaria você a atingir seu objetivo:

Substituir

RewriteRule ^ouvidoria/$ /ouvidoria/index.php

com

RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]

A versão original da regra corresponde apenas /ouvidoria/ao URI. Portanto, a solicitação chega ao segundo RewriteRule, o que causa um comportamento como você descreveu.

A versão fixa da regra corresponde a /ouvidoria/e /ouvidoria.

Responder2

Bem, por alguma razão a directiva DirectorySlash Offfuncionou agora. Já tentei desativar isso antes, mas geraria um erro 500. Já reescrevi essas regras várias vezes, talvez tenha removido o que entrava em conflito com o DirectorySlash e agora essa diretiva está funcionando conforme o esperado.

Agradeço também a @Tero Kilkanen por me ajudar a resolver o primeiro problema.

informação relacionada