Importa em que ordem as regras são colocadas no htaccess?

9

Espero que seja uma resposta SIM ou NÃO simples (especifique o motivo)

Q1: importa em que ordem as regras são colocadas no htaccess? Como são itens completamente separados: por exemplo

P2: Se sim, estou aplicando a ordem certa? para acelerar o mecanismo htacces e não sobrecarregá-lo com regras desnecessárias?

Q3: quaisquer dicas sobre o que desativar / adicionar aqui são bem-vindas +1!


# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /

#####################################################

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M172800
    Header unset ETag
    FileETag None
    Header unset Pragma

    ##### STATIC FILES
    <FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
        ExpiresDefault M1209600
        Header set Cache-Control "public, max-age=1209600"
    </FilesMatch>

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(php)$">
        ExpiresDefault M604800
        Header set Cache-Control "public, max-age=604800"
    </FilesMatch>
</IfModule>

#####################################################

#  /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$  /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

####################################################

# NO WWW   http://www. becomes always http://
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz

##############################################################

ErrorDocument 500 /
ErrorDocument 404 /
Sam
fonte

Respostas:

10

Bem, os arquivos .htaccess usam o mesmo formato que o arquivo de configuração normal do Apache, portanto as mesmas regras se aplicam.

A maioria das configurações não depende da ordem, mas algumas dependem da configuração.

RewriteRulee, RewriteCondpor exemplo, são sensíveis à ordem, portanto, nesse caso, a resposta é SIM.

Veja por exemplo

http://wiki.apache.org/httpd/RewriteRule

para uma explicação da ordem em que estes são avaliados.

sleske
fonte
4

Isto é importante. Citando a partir da documentação para RewriteRule :

A ordem em que essas regras são definidas é importante - é a ordem em que elas serão aplicadas no tempo de execução.

Flimm
fonte
1
Dentro do mod_rewrite, isso importa - sim. No entanto, o OP não está abordando especificamente mod_rewrite e existem muitas outras diretivas de outros módulos no .htaccessarquivo do OP . Em resumo, as diretivas de diferentes módulos (e em diferentes contêineres ) são executadas independentemente e em uma ordem predefinida, independentemente da ordem aparente no arquivo de configuração.
precisa saber é o seguinte
1

Não posso falar sobre como a ordem dos <files>vs <Rewrite>, por exemplo, afeta o desempenho. Estou tentando descobrir isso sozinho. Não consegui encontrar nenhuma informação sobre isso, então possivelmente isso não importa?

No entanto, gostaria de salientar que entre Rewritevs Redirect(e RedirectMatch), a ordem de execução pode não estar na ordem listada, embora isso seja frequentemente o que as pessoas podem esperar.
Especificamente, os módulos mod_rewritee mod_aliassão processados ​​/ executados de forma independente e em essa ordem.

  1. Todas as diretivas mod_rewrite ( Rewrite) são executadas (na ordem em que são listadas).
  2. ENTÃO todas as diretivas mod_alias ( Redirecte RedirectMatch) são executadas na ordem em que estão listadas no arquivo.

Portanto, mesmo que a Redirectprossiga a Rewrite, o redirecionamento será processado somente após todas as regravações terem sido processadas.

Uma maneira de manter o arquivo "legível" se você tiver redirecionamentos e reescrições, é não usar o mod_alias módulo. Em vez disso, use apenas mod_rewrite. Reescrever com o sinalizador [R] basicamente o transforma em uma reescrita.
A resposta deste webmaster mostra como.

Agora, todas as diretivas serão executadas na ordem em que aparecem no arquivo, para que não haja surpresas desagradáveis ​​ou confusão sobre a ordem de execução. Como alternativa, você pode realocar fisicamente todas as diretivas Redirecte RedirectMatchpara a "parte inferior" do arquivo, para se lembrar de que elas não serão executadas até depois do Rewrites de qualquer maneira.

Aqui estão algumas boas respostas do StackExchange que esclareceram sobre esse ponto:

Quanto ao resto, não consegui encontrar nenhuma informação sobre desempenho entre colocar filesantes ou depois de rewrites, por exemplo. O único conselho baseado em desempenho que encontrei é que, se alguém tiver acesso aos arquivos de configuração do servidor, é melhor mover o máximo possível do arquivo .htaccess para o arquivo de configuração e desabilitar os arquivos .htaccess por completo (ou especificar diretórios específicos em que arquivos .htaccess devem ser lidos).

A lógica é que as regras colocadas no arquivo de configuração precisam ser lidas apenas uma vez. Se o processamento do htaccess estiver ativado, para cada solicitação, todos os diretórios do servidor (iguais ou superiores ao diretório solicitado) deverão ser pesquisados ​​em busca de possíveis arquivos htaccess, existindo ou não. E se o fizerem, cada um deve ser lido novamente.

SherylHohman
fonte
-1

Tenho a mesma preocupação, mas esta é uma perspectiva do site de administração do servidor que permite reiniciar o apache após uma alteração na configuração do servidor apache.

Até agora, a melhor resposta que recebi é listar primeiro as diretivas relacionadas a arquivos.

Isso faz sentido relacionado à necessidade do apache de gerenciar diretórios e instruções htaccess em cada diretório.

Portanto, liste primeiro as diretivas relacionadas ao arquivo e depois os blocos óbvios para finalizar o processo apache htaccess na ordem do óbvio.

Solução possível para otimizar as solicitações: - solicitar correções relacionadas a URL - restrições relacionadas ao diretório - restrições relacionadas ao índice - restrições relacionadas a arquivos - restrições de proxy <- matar tudo - agente de usuário vazio <- matar tudo ... a lista é divertida sem fim

Minha preocupação estava relacionada à sequência de diretrizes. Por exemplo, devo definir diretivas de índice, arquivo e cabeçalho antes de RewriteConds?

Bancada
fonte
nota de rodapé: Substituição de padrão RewriteRule [flags] não responde a essa pergunta óbvia de processamento de aplicativos!
Testbench