Quel est l'équivalent d'Apache des try_files de Nginx?

12

Dans Nginx, il existe try_filesune directive de configuration qui "vérifie l'existence des fichiers dans l'ordre et renvoie le premier fichier trouvé". Je trouve ça très bien de faire ça

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

qui est un moyen sûr de servir directement des fichiers statiques, sans déranger les frameworks web. Comment puis-je faire la même chose dans Apache?

phunehehe
la source
1
Quelle est la solution que vous avez choisie? La réponse sélectionnée ne correspond pas vraiment à mon cas d'utilisation.
panepeter

Réponses:

9

Je vois généralement cela avec mod_rewrite:

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

Cela signifie "Si un fichier n'existe pas sur le système de fichiers, puis procurez-le via mon cluster mod_proxy_balancer." Sinon, si le fichier existe sur le système de fichiers, il est simplement servi par Apache par rapport à celui défini DocumentRootdans votre virtualhost.

Mais ce n'est pas ma façon préférée, principalement parce qu'elle nécessiterait un statappel système par demande.

Avec mod_proxy, vous pouvez utiliser ProxyPassMatchsi vous avez une nouvelle version d'Apache ( voir la documentation ). Tel que:

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

Qui utilise le! pour indiquer qu'Apache ne doit pas utiliser de requêtes proxy correspondant à cette expression régulière.

Si vous utilisez une ancienne version d'Apache, vous aurez la ProxyPassdirective à votre disposition, mais elle ne correspond qu'aux préfixes URI (c'est ma méthode préférée actuelle):

ProxyPass /images !
ProxyPass /stylesheets !

Bien sûr, si vous devez faire une correspondance d'expressions régulières comme vous l'avez mentionné ci-dessus, vous pouvez simplement modifier la règle mod_rewrite que j'ai publiée en haut pour annuler une correspondance avec le %{REQUEST_URI}.

J'espère que cela pourra aider!

loopforever
la source
2
Je pense que le "mauvais" moyen est plus similaire try_files, car il vérifie l'existence du fichier. Cependant, il ne semble pas y avoir de moyen de le faire ProxyPass.
phunehehe du