Was ist Apaches Äquivalent zu Nginx's try_files?

12

In Nginx gibt es try_fileseine config-Direktive, die "das Vorhandensein von Dateien in der angegebenen Reihenfolge überprüft und die erste gefundene Datei zurückgibt". Ich finde es sehr ordentlich, dies zu tun

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

Dies ist eine sichere Methode, um statische Dateien direkt bereitzustellen, ohne die Web-Frameworks zu beeinträchtigen. Wie kann ich dasselbe in Apache machen?

phunehehe
quelle
1
Für welche Lösung haben Sie sich entschieden? Die ausgewählte Antwort entspricht nicht wirklich meinem Anwendungsfall.
Panepeter

Antworten:

9

Ich sehe das normalerweise mit mod_rewrite:

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

Es bedeutet "Wenn eine Datei im Dateisystem nicht vorhanden ist, proxyen Sie sie über meinen mod_proxy_balancer-Cluster." Andernfalls wird die Datei, wenn sie im Dateisystem vorhanden ist, von Apache nur relativ zu der DocumentRootin Ihrem virtuellen Host definierten Datei bereitgestellt.

Aber das ist nicht meine Lieblingsmethode, vor allem, weil es einen statSystemaufruf pro Anfrage erfordern würde .

Mit mod_proxy können Sie verwenden, ProxyPassMatchwenn Sie eine ausreichend neue Version von Apache haben ( siehe Dokumentation ). Sowie:

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

Welches nutzt die! Apache sollte keine Proxy-Anfragen stellen, die diesem regulären Ausdruck entsprechen.

Wenn Sie eine ältere Version von Apache verwenden, steht Ihnen die ProxyPassDirektive zur Verfügung, sie stimmt jedoch nur mit URI-Präfixen überein (dies ist meine derzeit bevorzugte Methode):

ProxyPass /images !
ProxyPass /stylesheets !

Wenn Sie einen Abgleich mit regulären Ausdrücken durchführen müssen, wie oben erwähnt, können Sie einfach die mod_rewrite-Regel ändern, die ich oben veröffentlicht habe, um eine Übereinstimmung mit der zu negieren %{REQUEST_URI}.

Ich hoffe, das hilft!

loopforever
quelle
2
Ich denke, der "schlechte" Weg ist ähnlicher try_files, weil er die Existenz der Datei überprüft. Es scheint jedoch keinen Weg zu geben, dies zu tun ProxyPass.
Phunehehe