В 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}
.
Надеюсь, это поможет!