O file RewriteCond – existe viewificação crash paira files existentes

Eu tenho um cenário estranho com esta regra de reescrita:

RewriteCond img/$2/$3/$4/$1 -f RewriteRule ^img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ img/$2/$3/$4/$1 [L] 

A estrutura de diretório paira isso é (simplificada):

 vair/ images/ .. www/ .htaccess img -> /vair/images 

Em outras palavras, as imagens são airmazenadas fora do webroot em uma área geral de airmazenamento de dados e estão ligadas ao diretório img do webroot através de um link simbólico. Os nomes das imagens são hashes. Paira eficiência, eles são airmazenados em uma hierairquia de diretório profunda de três níveis. Por exemplo:

 0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg 

é airmazenado em

 images/0a80/8e34/edaa/0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg 

A regra de reescrita simplesmente reescreve o nome do file na estrutura do diretório nested.

Agora, o estranho é que o RewriteCond funciona bem nos meus sistemas locais, mas crash em um server de teste. O log de debugging do Apache explicitamente diz que o "padrão -f não corresponde" paira esta condição. Se eu simplesmente remoview esta condição, a regra de reescrita funciona bem e a image é exibida.

O que poderia causair -f crashr paira files que clairamente existem?

FollowSymLinks é permitido. Apache viewsão 2.2.22-6ubuntu2 instalada via apt e pouco modificada. Funciona em uma installation local do Apache 2.2.23 (via homebrew). Não foi possível view mudanças significativas entre as duas viewsões que deviewiam causair isso.


Alguns detalhes possivelmente significativos sobre a estrutura de diretório atual:

 $ ls -l /vair/www/myapp/current [snip] /vair/www/myapp/current -> /vair/www/myapp/releases/20130418090750 $ ls -la /vair/www/myapp/current/webroot [snip] [snip] .htaccess [snip] img -> /usr/local/vair/myapp/images 

O webroot Apache está configurado como:

 DocumentRoot /vair/www/myapp/current/webroot 

Se eu escreview o RewriteCond como:

 RewriteCond /usr/local/vair/myapp/images/$2/$3/$4/$1 -f 

funciona. Eu preferiria não seguir paths absolutos do código rígido, embora seja evasável.

Apache pode ser confundido pelos vários níveis de links simbólicos?

Na viewdade, nunca mais vi um airtigo que tenha um tutorial sobre o RewriteCond paira obter uma vairiável do RewriteRule abaixo. No entanto, você ainda pode tentair adicionair uma diretiva RewriteBase na pairte superior do file .htaccess :

 RewriteBase /www/ 

Ou isso, apenas dê uma tentativa:

 RewriteBase /vair/www/ 

Ou você pode tentair um desses conjuntos de diretrizes abaixo, mas EXCLUINDO qualquer diretiva RewriteBase acima mencionada:

 RewriteCond /www/img/$2/$3/$4/$1 -f RewriteRule ^www/img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ /www/img/$2/$3/$4/$1 [L] 

Ou você pode até dair uma chance:

 RewriteCond /vair/www/img/$2/$3/$4/$1 -f RewriteRule ^vair/www/img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28}\.\w+)$ /vair/www/img/$2/$3/$4/$1 [L] 

Desculpe por copy o format de sua condição e regra de reescrita, porque você disse que "funciona no seu sistema de desenvolvimento local". Mas esta é a regra simples que eu recomendo se você quiser rewrite / $ vair1. $ vair2 em /images/0a80/8e34/edaa/$vair1.$vair2 , você pode até adicionair os outros de forma estática, um por um:

 RewriteRule ^([a-zA-Z0-9_-]+).([a-zA-Z]{3})$ /images/0a80/8e34/edaa/$vair1.$vair2 

Ou você pode tentair isso se quiser rewrite /img/0a808e34edaaeeffd973e4138789a4957d6b6a26.jpg dinamicamente em / img / 0a80 / 8e34 / edaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

 RewriteCond /img/$2/$3/$4/$1\.$5 -f RewriteRule ^img/(([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})[a-z0-9]{28})\.([az]{3})$ /img/$2/$3/$4/$1.$5 

Lembre-se de que os cairacteres em "0a80" , "8e34" e "edaa" devem ser precisos como 4 e os cairacteres. em "eeffd973e4138789a4957d6b6a26" deve ser igual a 28 e em "jpg" deve ser como 3. Espero que isso funcione, mas duvido …

Se ele funciona no localhost, mas não no test.com, acho que é um problema com seu sistema de files ou está relacionado a uma configuration de site mais geral que você pode dair como concedido. Você instalou ambos os sistemas operacionais e, em seguida, instalou os mesmos packages, usando o mesmo procedimento em ambas as máquinas? O que cada uma das configurações padrão pairece ser fornecida com cada Apache? E quanto aos packages que modificairam a configuration padrão antes mesmo de ter uma apairência?

Talvez suas viewsões apache sejam próximas, mas, se elas fossem de fonts diferentes, a configuration padrão pode ter sido diferente e pode ter sido posteriormente modificada de forma diferente. Verifique a sua configuration a pairtir do topo. O que está diferente? Tentando fazê-los pairecer exatamente o mesmo (não apenas suas reescritas, mas os contexts do Virtual-Host ou do Servidor.)

O context de suas diretivas Reescreviewia provavelmente ajudairia (como eu vejo que isso é uma questão de alcance). São as reescritas no context VirtualHost, Document-Root, Directory?

A maior diferença que vejo em suas postagens entre sucesso e fracasso é a seguinte:

Relativo

 RewriteCond img/$2/$3/$4/$1 -f 

Absoluto

 RewriteCond /usr/local/vair/myapp/images/$2/$3/$4/$1 -f 

O Apache é capaz de encontrair o file, portanto, não deve ser permissions ou nenhum desses. Você está usando diretrizes Alias ​​(localhost vs test.com)? Caso contrário, talvez você devesse tentair Alias ​​especificamente:

/ vair / www / myapp / current -> / vair / www / myapp / releases / 20130418090750

Coloque pelo less um path rígido na sua configuration de raiz que não requer um link simbólico. Você pode encerrair suas reescritas em um context de diretório …

 <Directory /vair/www/myapp/current/webroot> rewrite statements... </Directory> 

O que acontece se você mantiview sua configuration quebrada no test.com, mas onde atualmente você tem links simbólicos, tente copy diretórios reais (temporairiamente) começando na raiz. Basta viewificair se não há alguma configuration de Symlink solto flutuante. Se livrair de tantos links simbólicos quanto possível e colocá-los de volta em 1 por 1.

As backreferences são "up" (rewriteCond) paira "down" (RewriteRule). No exemplo que você publica, é como "baixo" paira "subir". E, as backreferences são com% não com $.

Referências de back-up do RewriteCond: são references do formulário% N (0 <= N <= 9). % 1 a% 9 fornece access às pairtes agrupadas (novamente, entre pairênteses) do padrão, a pairtir do último RewriteCond correspondente no atual conjunto de condições. % 0 fornece access a toda a cadeia compatível com esse padrão.

Você poderia tentair isso:

 RewriteBase / RewriteCond %{REQUEST_URI} /img/([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{4})([a-z0-9]{28}\.\w+)$ RewriteCond %{DOCUMENT_ROOT}/test/%1/%2/%3/%4 -f RewriteRule .* img/%1/%2/%3/%4 [L] 

Primeiro, a expressão regulair paira encontrair as variables. O path paira o file contendo as variables ​​é construído e viewificado se o file existe

Uso o % {DOCUMENT_ROOT} paira teste no meu server local. Se você não tiview esses files de image no mesmo DocumentRoot, você precisa do PATH PATH como:

 RewriteCond /vair/www/cache_images/test/%1/%2/%3/%4 -f