A ordem das suas diretivas parece OK. No entanto, geralmente não é uma boa idéia misturar as diretivas mod_rewrite ( RewriteRule
) e mod_alias ( RedirectMatch
) no mesmo contexto. Explicação abaixo ...
Com os arquivos de configuração do Apache, os diferentes módulos do Apache (mod_rewrite, mod_alias, mod_expires, mod_access_compat / mod_authz_host, etc.) são processados independentemente, independentemente da ordem aparente das diretivas no arquivo de configuração. Mas dentro de cada módulo, as diretivas são geralmente processadas de cima para baixo (como você esperaria).
Se as diretivas fossem todas processadas de cima para baixo, talvez as diretivas RedirectMatch
no final nunca fossem processadas, porque o "front controller" mod_rewrite que a precede reescreve todas as solicitações de arquivos inexistentes para index.php
. Portanto, as diretivas mod_alias RedirectMatch
no final são processadas apenas confiavelmente porque os módulos são executados independentemente. No entanto, o mod_rewrite é executado antes das mod_alias de qualquer maneira, então a requisição possivelmente está sendo reescrita para index.php
antes do redirecionamento ocorrer ( RedirectMatch
funciona na URL original da requisição, então você está OK aqui).
- Should the
RedirectMatch
es be at the top?
Seria mais lógico ter os redirecionamentos externos antes das reescritas internas (seu controlador frontal mod_rewrite). No entanto, como você está usando mod_alias para seus redirecionamentos, eles são executados de qualquer maneira.
No entanto, como mencionado no meu parágrafo de abertura, "geralmente não é uma boa idéia misturar as diretivas mod_rewrite ( RewriteRule
) e mod_alias ( RedirectMatch
) no mesmo contexto." - Isso é porque você pode obter conflitos inesperados. Depende exatamente do que você está fazendo, mas se você tem as duas diretivas RewriteRule
e RedirectMatch
que correspondem à URL solicitada, então não é necessariamente óbvio que será executada (que é independente da ordem). das directivas). Por esse motivo, seria preferível converter as diretivas mod_alias RedirectMatch
para mod_rewrite RewriteRule
. Se você fizer isso, então as diretivas RewriteRule
obviamente devem ser antes do mod_rewrite font-controller existente, caso contrário elas nunca poderão ser executadas.
Does anything else in there need to be moved inside the <ifmodule>
block?
Você não precisa realmente do bloco <IfModule>
aqui. Isso só é necessário se seu aplicativo for projetado para funcionar sem o mod_rewrite. E duvido que este seja o caso. por exemplo. O WordPress usa um wrapper <IfModule>
porque ele pode funcionar bem sem o mod_rewrite (você simplesmente não obtém URLs tão "bonitas"). Se você usar um wrapper <IfModule>
e o mod_rewrite não estiver instalado, isso falhará silenciosamente. Remova o wrapper <IfModule>
e você receberá um erro fatal - o que ocorre antes que o sistema seja ativado e você pode corrigi-lo facilmente!
No entanto, um motivo válido para usar <IfModule>
blocks é se você tiver um módulo dependente de outro que está sendo habilitado. por exemplo. Você queria definir um Header
(com mod_headers) com a condição de que o URL fosse reescrito usando mod_rewrite. Nesse caso, você pode incluir a diretiva Header
dentro de um wrapper <IfModule mod_rewrite.c>
. No entanto, esses casos são bastante raros.
Com relação às várias diretivas RewriteEngine
. Como Gerald já declarou, você só precisa de um. É mais lógico ter isto na parte superior do seu arquivo (ou uma vez com o bloco de diretivas mod_rewrite - se elas estiverem em um bloco conciso mais abaixo no arquivo).
No entanto, este é um exemplo de onde a execução top-down (dentro de um módulo) é dividida (por isso, declarei apenas " geralmente processado de cima para baixo" acima). Você pode colocar a diretiva RewriteEngine On
em qualquer lugar no arquivo de configuração e ela ainda funciona - você pode colocá-la no final se quiser (mas isso é confuso)! Se você tem várias diretivas RewriteEngine
, então a última no arquivo vence e controla o arquivo inteiro (quando eu digo "arquivo", estritamente falando, quero dizer "contexto"). Você não pode ativar / desativar mod_rewrite em todo o arquivo. É On ou Off para o arquivo inteiro. Isso também significa que você pode rapidamente desabilitar as diretivas all mod_rewrite simplesmente colocando uma única diretiva RewriteEngine Off
na última linha do arquivo - você não precisa comentar as diretivas. (O mesmo se aplica à diretiva RewriteBase
.)