Como reescrever usando o htaccess se o arquivo existir em outra pasta?

1

Estamos tentando reescrever para outra pasta, caso o arquivo não exista na raiz do documento, mas exista na outra pasta.

A outra pasta está em um local completamente diferente, localizado usando "Alias" nos vhosts.

Então, o que temos até agora (desta postagem Como reescrever o URI do root se o arquivo existir na pasta? ) é:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/legacy/
RewriteRule ^(.*)$ legacy/$1 [QSA,L]

Isso funciona até certo ponto, mas parece direcionar tudo para a pasta legada, não apenas quando o arquivo não existe no primeiro local e existe no legado.

Agradecemos antecipadamente por qualquer ajuda, Jack.

    
por Jack 13.11.2013 / 16:55

1 resposta

0

No seu rascunho, o primeiro RewriteCond verifica se a página existe ou não na raiz, mas não há verificação se a página existe ou não na pasta alternativa, portanto, muito é redirecionado. (O segundo RewriteCond é aparentemente algum tipo de verificação anti-loop [que não funciona porque este é um redirecionamento interno não um redirecionamento externo] ou algum tipo de acesso direto ao diretório alternativo [que, dependendo do seu uso, pode nem ser uma boa ideia]).

Uma coisa tão simples de afirmar parece surpreendentemente complicada de implementar. O melhor que pude encontrar (espero que alguém saiba melhor) é:

# parse the current local filename into parts we can manipulate
# (weird construct and regex in first RewriteCond are because 
#  mod_rewrite never does any variable substitution on the righthand side)
RewriteCond %{DOCUMENT_ROOT},%{REQUEST_FILENAME} ^([^,]*),/*(.*)/+(.*)$
RewriteRule ^ - [E=CURPATH:/%2,E=CURNAME:%3]

# allow direct access to the alternate folder
#  (omit this entire ruleset if that's not desired)
RewriteCond %{ENV:CURPATH} !^/*legacy(?:/|$)
RewriteRule ^ - [L]

# do the checks and make the change if necessary
RewriteCond %{DOCUMENT_ROOT}/%{ENV:CURPATH}/%{ENV:CURNAME} !-f
RewriteCond %{DOCUMENT_ROOT}/legacy/%{ENV:CURPATH}/%{ENV:CURNAME} -f
RewriteRule ^ /legacy/%{ENV:CURPATH}/%{ENV:CURNAME} [L]

(Note que isto é um pouco mais do que apenas uma solução para seu problema declarado. Ele também tenta ser mais geral: trabalhando em todos os subdiretórios, trabalhando mesmo quando barras são dobradas, e trabalhando em diferentes Apaches com configurações sutilmente diferentes). / p>     

por 29.09.2015 / 01:00