Jaki jest odpowiednik Apache try_files Nginx?

12

W Nginx istnieje try_filesdyrektywa config, która „sprawdza, czy pliki istnieją w kolejności i zwraca pierwszy znaleziony plik”. Uważam to za bardzo miłe

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

który jest bezpiecznym sposobem bezpośredniego udostępniania plików statycznych, bez zawracania sobie głowy stronami internetowymi. Jak mogę zrobić to samo w Apache?

phunehehe
źródło
1
Jakie rozwiązanie wybrałeś? Wybrana odpowiedź tak naprawdę nie spełnia mojego przypadku użycia.
panepeter

Odpowiedzi:

9

Często widzę to zrobione za pomocą mod_rewrite:

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

Oznacza to: „Jeśli plik nie istnieje w systemie plików, należy go proxy przez mój klaster mod_proxy_balancer”. W przeciwnym razie, jeśli plik istnieje w systemie plików, jest po prostu obsługiwany przez Apache w stosunku do zdefiniowanego DocumentRootw twoim wirtualnym hoście.

Ale to nie jest mój ulubiony sposób, głównie dlatego, że wymagałoby statwywołania systemowego na żądanie.

Dzięki mod_proxy możesz używać, ProxyPassMatchjeśli masz wystarczająco nową wersję Apache ( zobacz dokumentację ). Jak na przykład:

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

Który wykorzystuje! wskazując, że Apache nie powinien proxy żądań pasujących do tego wyrażenia regularnego.

Jeśli używasz starszej wersji Apache, będziesz mieć do ProxyPassdyspozycji dyrektywę, ale pasuje ona tylko do prefiksów URI (jest to moja obecna preferowana metoda):

ProxyPass /images !
ProxyPass /stylesheets !

Oczywiście, jeśli musisz wykonać dopasowanie wyrażeń regularnych, jak wspomniano powyżej, możesz po prostu zmodyfikować regułę mod_rewrite, którą zamieściłem na górze, aby zanegować dopasowanie do %{REQUEST_URI}.

Mam nadzieję, że to pomaga!

loopforever
źródło
2
Myślę, że „zły” sposób jest bardziej podobny try_files, ponieważ sprawdza istnienie pliku. ProxyPassJednak wydaje się, że nie ma na to sposobu .
phunehehe