htaccess estrutura, o que vai onde

1

Eu só estou querendo saber se eu tenho o meu htaccess estrutura correta, eu não consigo encontrar muita informação sobre o onde para colocar as coisas no arquivo htaccess, Então eu meio que joguei tudo junto. Mas sem querer colar todo o htaccess aqui, um resumo do meu htaccess é o seguinte:

Options +FollowSymlinks
RewriteEngine On

order allow,deny
deny from {IP}
allow from all

#Prevent directory listings
Options All -Indexes

# compress text, html, javascript, css, xml:
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

ErrorDocument 403 /foo/bar/403.html

<IfModule mod_rewrite.c>        
    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php [L]

</IfModule>


# Redirects
RedirectMatch 301 (?i)^/some-fancy-url/?$ /foo/bar/page.php

Há muito mais RedirectMatch s lá e RewriteCond . Tudo parece estar funcionando bem. Duas perguntas que tenho:

  1. Alguma outra coisa precisa ser movida dentro do bloco <ifmodule> ?
  2. O RedirectMatche s deve estar no topo?
por Chud37 04.08.2017 / 10:22

2 respostas

1

Isso depende do seu caso de uso. O arquivo .htaccess é processado na ordem em que você escreve as linhas.

Exemplo:

Se as suas condições dentro de <IfModule> corresponderem a uma solicitação, o RedirectMatch nunca será alcançado, pois o RewriteRule está marcado como [L] , significando Last .
Se você quiser que a regra RedirectMatch tenha uma prioridade mais alta, é necessário movê-la. Se a prioridade estiver bem agora, deixe como está.

Em relação ao move inside the IfModule block :

A diretiva <IfModule> verifica se o módulo fornecido está carregado.

Upside: Se o módulo não for carregado por algum motivo, o Apache ainda será iniciado sem produzir um erro.
Desvantagem: seu aplicativo pode não funcionar porque a reescrita não está funcionando.

Você pode apenas remover as diretivas <IfModule> , para detectar o problema com o módulo ausente imediatamente na inicialização do Apache. É claro que, nesse caso, nada funcionará, porque o Apache não será iniciado.

Cabe a você como você deseja que o servidor se comporte.

Mover as diretivas AddOutputFilterByType (ou outras) dentro do <IfModule mod_rewrite.c> não faz sentido, porque elas não dependem desse módulo.
Seria mais sensato envolvê-los com seu próprio módulo, mod_deflate :

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
# ... and so on
</IfModule>

A única coisa que alterei no seu arquivo é omitir a primeira linha RewriteEngine On . Só é necessário uma vez, e você já o tem corretamente dentro do seu bloco <IfModule> .

    
por 04.08.2017 / 10:46
1

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

  1. Should the RedirectMatches 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 .)

    
por 04.08.2017 / 11:02

Tags