As condições de reescrita do mod de curto-circuito do apache

2

Aqui está a minha pergunta

Meu regex simples está funcionando muito bem, eu só quero ter certeza de que a primeira parte do regex curto-circuitos para a eficiência, eu coloquei minhas perguntas em linha

1- O que essa coisa deve fazer é, os arquivos com as extensões listadas não devem ser reescritos se o arquivo existir, se o arquivo não existir, nós reescrevemos o pedido para o nosso arquivo php, todos os outros arquivos tipos são sempre reescritos, independentemente da existência de um arquivo.

  • Primeira condição, o arquivo tem alguma das seguintes extensões?

Por exemplo:

RewriteCond %{REQUEST_FILENAME} \.(php|gif|jpg|png|ico|swf|flv|avi|mpg|jpeg|gz|ram)$
  • Segunda condição, se o arquivo é uma das nossas extensões acima, ele existe no sistema de arquivos?

  • A avaliação desta declaração é dispendiosa e eu quero ter certeza de que estamos em curto circuito no RewriteCond anterior e que isso só será verificado se o valor acima for avaliado como verdadeiro.

  • também precisa saber se o sistema operacional ou o apache armazenará em cache o resultado da existência do arquivo (por exemplo, o php faz o cache dos resultados do is_file ())

Por exemplo:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ my_index.php?q=$1 [L,QSA]
  • Diretórios e arquivos a serem deixados sozinhos .... já que se eles passaram
  • o teste de existência de arquivo, eles não devem ser reescritos

Por exemplo:

RewriteRule \.(php|gif|jpg|png|ico|swf|flv|avi|mpg|jpeg|gz|ram)$ - [L]
RewriteRule ^robots.txt$ - [L]
RewriteRule ^(.*)$ my_index.php?q=$1 [L,QSA]
por user158369 10.02.2013 / 16:23

1 resposta

3

Não, ele irá analisar cada uma das suas regras de reescrita, de cada tipo, por sua vez. O regex pode causar curto-circuito ou não dependendo da libpcre, mas cada saída de RewriteRule é alimentada na próxima regra da lista. Dos documentos:

Rewrite rules are applied to the results of previous rewrite rules, in the order in which they are defined in the config file.

link

No entanto, uma ou mais regras RewriteCond podem existir antes de um RewriteRule , e elas realmente causarão um curto-circuito. Então, se as instruções aparecem no arquivo na ordem que você as tem:

RewriteCond %{REQUEST_FILENAME} \.(php|gif|jpg|png|ico|swf|flv|avi|mpg|jpeg|gz|ram)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ my_index.php?q=$1 [L,QSA]
  1. A extensão será verificada; se não estiver nessa lista, o próximo RewriteRule não será executado e todos os RewriteCond s antes dele (o caro em particular) não serão verificados.
  2. Caso contrário, o caro sistema de arquivos RewriteCond será evocado; se for falso, a mesma coisa acontece como acima.
  3. Se verdadeiro, o URL será reescrito.
por 10.02.2013 / 19:37