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


12

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

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

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


1
Какое решение вы выбрали? Выбранный ответ не соответствует моему варианту использования.
panepeter

Ответы:


9

Я обычно вижу это сделано с 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}.

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


2
Я думаю, что «плохой» способ больше похож на то try_files, потому что он проверяет наличие файла. ProxyPassХотя, похоже, нет способа сделать это .
phunehehe
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.