Qual é o equivalente do Apache aos try_files do Nginx?


12

No Nginx, existe try_filesuma diretiva de configuração que "verifica a existência de arquivos em ordem e retorna o primeiro arquivo encontrado". Acho muito legal fazer isso

location ~* \.(gif|jpe?g|css|js)$ {
    try_files $uri 404;
}

que é uma maneira segura de veicular arquivos estáticos diretamente, sem incomodar as estruturas da web. Como posso fazer a mesma coisa no Apache?


1
Qual foi a solução que você escolheu? A resposta selecionada realmente não atende ao meu caso de uso.
22818 panepeter

Respostas:


9

Eu costumo ver isso feito com mod_rewrite:

 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
 RewriteRule ^/(.*)$ balancer://app_cluster%{REQUEST_URI} [P,QSA,L]

Significa "Se um arquivo não existir no sistema de arquivos, faça o proxy através do meu cluster mod_proxy_balancer". Caso contrário, se o arquivo existir no sistema de arquivos, ele será simplesmente exibido pelo Apache em relação ao definido DocumentRootno seu host virtual.

Mas essa não é a minha maneira favorita, principalmente porque exigiria uma statchamada do sistema por solicitação.

Com mod_proxy, você pode usar ProxyPassMatchse tiver uma versão nova o suficiente do Apache ( consulte a documentação ). Tal como:

ProxyPassMatch \.(gif|jpe?g|css|js)$ !

Que usa o! para indicar que o Apache não deve fazer proxy de solicitações correspondentes a essa expressão regular.

Se você estiver usando uma versão mais antiga do Apache, você terá a ProxyPassdiretiva disponível, mas ela corresponderá apenas aos prefixos de URI (este é o meu método preferido atualmente):

ProxyPass /images !
ProxyPass /stylesheets !

Obviamente, se você deve fazer a correspondência de expressões regulares conforme mencionado acima, pode simplesmente modificar a regra mod_rewrite que publiquei na parte superior para negar uma correspondência contra a %{REQUEST_URI}.

Espero que ajude!


2
Eu acho que o caminho "ruim" é mais parecido com try_files, porque verifica a existência do arquivo. Não parece haver uma maneira de fazer isso ProxyPass.
phunehehe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.