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.php
arquivo. O problema é que por algum motivo quando acessamos a /ouvidoria
URL 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 /ouvidoria
para /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 /ouvidoria
para /ouvidoria/
. Captura de tela da guia Rede:
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 Off
funcionou 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.