No Apache, o arquivo .htaccess substitui o httpd.conf para mod_rewrites?

5

No meu arquivo Apache httpd.conf , tenho essa declaração dentro de uma tag VirtualHost .

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.shanestillwell.com$ [NC]
RewriteRule ^(.*)$ http://www.shanestillwell.com/$1 [L,R=301]

E isso dentro do meu .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

A regra no meu httpd.conf parece ser ignorada. As regras em .htaccess estão eliminando a regra de reescrita de httpd.conf ?

    
por Shane Stillwell 24.08.2010 / 15:40

3 respostas

4

Geralmente, suas configurações no arquivo .htaccess dentro de um diretório substituem as configurações do arquivo httpd.conf. Você pode desabilitar esse efeito editando seu arquivo httpd.conf e alterando a seguinte linha

  <Directory ...> 
  AllowOverride all

para

    <Directory ...> 
    AllowOverride none

Isso evitará que o arquivo .htaccess sobrescreva as configurações do httpd.conf. Então as configurações no arquivo .htaccess não terão efeito.

    
por 24.08.2010 / 16:37
1

se você tiver um <Directory ...> com AllowOverride all , o que quer que você tenha em seu arquivo .htaccess substituirá qualquer regra anterior.

Pode estar em httpd.conf ou virtualhost , desde que aponte para / ou para o caminho do seu domínio.

    
por 24.08.2010 / 16:16
1

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).

    
por 14.04.2018 / 02:43