In Apache does the .htaccess file override the httpd.conf for mod_rewrites?
Tomada literalmente, a resposta é "Não". No entanto, ...
In my Apache httpd.conf
file I have this declaration inside a VirtualHost
tag
Se realmente estiver diretamente dentro do contêiner <VirtualHost>
, isto é. em um contexto virtualhost , então essas diretivas mod_rewrite devem sobrescrever as diretivas mod_rewrite no seu arquivo .htaccess
- não o contrário. Esse comportamento não pode ser alterado (por exemplo, alterando a herança do mod_rewrite com a diretiva RewriteOptions
).
No entanto, se essas diretivas estiverem dentro de um contêiner <Directory>
(que está dentro do contêiner <VirtualHost>
), ex. em um contexto diretório (em oposição a um contexto virtualhost , como sugerido acima), então as diretivas mod_rewrite no seu arquivo .htaccess
irão sobrescrever completamente as diretivas mod_rewrite em seu <Directory>
container. No entanto, esse comportamento pode ser alterado alterando a forma como as diretivas mod_rewrite são herdadas. (Por qualquer configuração RewriteOptions InheritBefore
no arquivo .htaccess
, ou RewriteOptions InheritDownBefore
no contêiner pai<Directory>
. InheritDownBefore
requer o Apache 2.4.8. No entanto, há outras ressalvas com a herança mod_rewrite para estar ciente.)
Referência: link
O comportamento que você está vendo (e a sintaxe específica da diretiva usada (veja abaixo) - embora isso possa simplesmente ser um erro se o código nunca foi executado?) sugere que essas diretivas estão em um diretório contexto, não um contexto virtualhost . Então, sim, as diretivas mod_rewrite em .htaccess
irão sobrescrever completamente as diretivas pai - as diretivas mod_rewrite no container <Directory>
são efetivamente ignoradas.
Além de:
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
Se isso fosse usado em um contexto virtualhost , você teria uma barra dupla errônea no início do caminho da URL, porque em um contexto virtualhost a RewriteRule
padrão corresponde ao caminho completo da URL (que inclui um prefixo de barra). Portanto, o $1
backreference em si já conteria um prefixo de barra antes de incluir uma barra adicional na substituição .
No entanto, em um contexto diretório , o padrão RewriteRule
corresponde a um caminho parcial - um caminho do sistema de arquivos menos o prefixo de diretório (que termina com uma barra) - então o caminho que é correspondido pelo padrão RewriteRule
nunca começa com uma barra em um contexto diretório (então você precisa incluí-lo na substituição - como você fez).