Назад | Перейти на главную страницу

Что такое Apache-эквивалент try_files Nginx?

В Nginx есть try_files, директива config, которая «по порядку проверяет наличие файлов и возвращает первый найденный файл». Я нахожу это очень изящным

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

Это безопасный способ прямого обслуживания статических файлов, не беспокоя веб-фреймворки. Как я могу сделать то же самое в Apache?

Я обычно вижу это с помощью mod_rewrite:

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

Это означает: «Если файл не существует в файловой системе, проксировать его через мой кластер mod_proxy_balancer». В противном случае, если файл существует в файловой системе, он просто обслуживается Apache относительно определенного DocumentRoot в вашем виртуальном хосте.

Но это не мой любимый способ, в основном потому, что для этого потребуется stat системный вызов по запросу.

С mod_proxy вы можете использовать ProxyPassMatch если у вас достаточно новая версия Apache (см. документацию). Такие как:

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

Которая использует! чтобы указать, что Apache должен не запросы прокси, соответствующие этому регулярному выражению.

Если вы используете старую версию Apache, у вас будет ProxyPass доступна вам, но она соответствует только префиксам URI (это мой текущий предпочтительный метод):

ProxyPass /images !
ProxyPass /stylesheets !

Конечно, если вы должны выполнить сопоставление регулярных выражений, как вы упомянули выше, вы можете просто изменить правило mod_rewrite, которое я разместил вверху, чтобы свести на нет совпадение с %{REQUEST_URI}.

Надеюсь, это поможет!