htaccess reescrever não funciona para todas as regras
-
06-07-2019 - |
Pergunta
Este é um problema muito estranho, e eu só espero que eu possa explicar isso claramente.
Basicamente, fizemos uma grande atualização em um site do cliente de hoje, e precisava atualizar algumas regras de reescrita no htaccess para acomodar a nova estrutura, etc ...
Então, onde nós originalmente tinha coisas como:
RewriteRule ^/resources/?$ index.php?id=resources
RewriteRule ^/media/?$ media.php
Nós alterado para:
RewriteRule ^/resources/?$ index.php?id=resources
RewriteRule ^/media/?$ index.php?id=media
Mas quando visitamos http://www.example.com/media - ele estava exibindo a página de media de idade. Então, quando nós removemos o velho media.php da raiz do documento, temos 404s. Algo em algum lugar ainda está mapeando / mídia para media.php -. E ignorando a regra de reescrita ??p>
O estranho é - todas as outras regras de reescrita no arquivo estão funcionando bem - e há cerca de 20 ou assim lá
.Nós temos monitorado cima e para baixo o vhost e outros arquivos de configuração, mas não consegue encontrar qualquer referência a meios de comunicação ou outros redirecionamentos quebrados (três no total) -. Por isso estamos perplexos
Solução 2
Desativar a opção MultiViews no .htaccess local fixo a questão -. Parecia que este foi permitindo a negociação de conteúdo que estava sendo processado antes a reescrever as regras
Outras dicas
Eu suspeito fortemente que isso seria devido a AcceptPathInfo, que na minha opinião é uma mis-recurso Apache. Por padrão Eu acredito que é ligado onde PHP é o manipulador.
Tente adicionar ao seu .htaccess, ou, de preferência o seu httpd.conf (e reiniciar):
AcceptPathInfo Off
Veja: http://httpd.apache.org/docs /2.2/mod/core.html#acceptpathinfo
-
Alguns pontos secundários:
Você deve garantir que seus RewriteRules sempre terminam com [L] depois de ter encontrado um jogo - ele vai ajudar na depuração. Por exemplo:.
RewriteRule ^/media/?$ index.php?id=media [L]
Além disso, você pode reduzir o número de regras, combinando os similares; por exemplo:.
RewriteRule ^/(media|resources)/?$ index.php?id=$1 [L]
Pessoalmente acho que o uso de /? no final do seu primeiro semestre não é bom, porque significa que ambos os URLs trabalhar, sem redirecionamento, o que significa que você não tem uma definitiva, que é 'correta'. Pessoalmente, eu usaria:
RewriteRule ^/(media|resources)/$ index.php?id=$1 [L]
RewriteRule ^/(media|resources)$ /$1/ [L,R]
Em outras palavras, um recurso único deve ter um único canônica URL, (definitiva).