Vraag Wat is het equivalent van Apache van de try_files van Nginx?


In Nginx is dat zo try_files, een configuratie-instructie die "controleert of er bestanden op volgorde zijn en het eerste bestand dat wordt gevonden, retourneert". Ik vind het heel netjes om dit te doen

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

wat een veilige manier is om direct statische bestanden te versturen, zonder de web-frameworks te storen. Hoe kan ik hetzelfde doen in Apache?


11
2017-07-15 05:00


oorsprong


Waar was je de oplossing voor? Het geselecteerde antwoord voldoet niet echt aan mijn gebruik. - panepeter


antwoorden:


Ik zie dit vaak gedaan met mod_rewrite:

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

Het betekent "Als een bestand niet bestaat in het bestandssysteem, dan proxy het via mijn mod_proxy_balancer cluster." Anders, als het bestand bestaat op het bestandssysteem, wordt het gewoon geserveerd door Apache ten opzichte van de gedefinieerde DocumentRoot in je virtuele host.

Maar dat is niet mijn favoriete manier, vooral omdat het een stat systeemoproep per aanvraag.

Met mod_proxy kunt u gebruiken ProxyPassMatch als je een nieuw genoeg versie van Apache hebt (zie documentatie). Zoals:

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

Welke gebruikt de! om aan te geven dat Apache zou moeten niet proxy-aanvragen die overeenkomen met die reguliere expressie.

Als u een oudere versie van Apache gebruikt, heeft u de ProxyPass richtlijn beschikbaar voor u, maar het komt alleen overeen met URI-prefixen (dit is mijn huidige voorkeursmethode):

ProxyPass /images !
ProxyPass /stylesheets !

Natuurlijk, als je regelmatig expressie-matching moet doen zoals je hierboven hebt vermeld, dan kun je gewoon de mod_rewrite-regel aanpassen die ik bovenaan heb gepost om een ​​wedstrijd tegen de %{REQUEST_URI}.

Ik hoop dat het helpt!


7
2017-07-15 17:51



Ik denk dat de "slechte" manier meer lijkt op try_files, omdat het controleert of het bestand bestaat. Er lijkt geen manier om het te doen ProxyPass though. - phunehehe