¿Cuál es el equivalente de Apache de los archivos de prueba de Nginx?

12

En Nginx existe try_filesuna directiva de configuración que "comprueba la existencia de archivos en orden y devuelve el primer archivo que se encuentra". Me parece muy ordenado hacer esto

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

que es una forma segura de servir directamente archivos estáticos, sin molestar a los marcos web. ¿Cómo puedo hacer lo mismo en Apache?

phunehehe
fuente
1
¿Cuál fue la solución que buscaste? La respuesta seleccionada realmente no cumple con mi caso de uso.
panepeter

Respuestas:

9

Comúnmente veo esto hecho con mod_rewrite:

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

Significa "Si un archivo no existe en el sistema de archivos, dele el proxy a través de mi clúster mod_proxy_balancer". De lo contrario, si el archivo existe en el sistema de archivos, Apache simplemente lo sirve en relación con lo definido DocumentRooten su host virtual.

Pero esa no es mi forma favorita, principalmente porque requeriría una statllamada al sistema por solicitud.

Con mod_proxy, puede usarlo ProxyPassMatchsi tiene una versión suficientemente nueva de Apache ( consulte la documentación ). Como:

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

Que utiliza el! para indicar que Apache no debe proxy solicitudes que coinciden con esa expresión regular.

Si está utilizando una versión anterior de Apache, tendrá la ProxyPassdirectiva disponible, pero solo coincide con los prefijos de URI (este es mi método preferido actual):

ProxyPass /images !
ProxyPass /stylesheets !

Por supuesto, si debe hacer una coincidencia de expresiones regulares como mencionó anteriormente, simplemente puede modificar la regla mod_rewrite que publiqué en la parte superior para negar una coincidencia contra el %{REQUEST_URI}.

¡Espero que ayude!

loopforever
fuente
2
Creo que la forma "mala" es más similar try_files, porque verifica la existencia del archivo. Sin embargo, no parece haber una manera de hacerlo ProxyPass.
phunehehe