try_files

Тема дорожной карты · Nginx

Директива try_files указывает Nginx последовательно проверять ряд путей файловой системы или именованных локейшенов и отдавать первый существующий, возвращаясь к последнему URI или коду статуса, если ни один из предыдущих вариантов не нашёлся — что делает её незаменимой для одностраничных приложений, WordPress и пользовательской маршрутизации URL. Наиболее распространённый шаблон try_files для SPA — try_files $uri $uri/ /index.html: Nginx сначала ищет точное совпадение файла, затем директорию с индексом и наконец возвращается к index.html, чтобы клиентская маршрутизация на JavaScript могла обработать путь. Для PHP-приложений вроде WordPress шаблон try_files $uri $uri/ /index.php?$args гарантирует, что запросы к несуществующим путям передаются PHP-фронтконтроллеру, а не возвращают ошибку 404. Последний аргумент try_files может быть URI, именованным локейшеном (@fallback) или кодом ошибки с =, например =404, что даёт точный контроль над поведением при откате. Понимание try_files необходимо для корректной настройки Nginx как сервера статических файлов, обратного прокси или PHP-веб-сервера, поскольку неправильная конфигурация приводит либо к сломанной маршрутизации, либо к непреднамеренному раскрытию файловой системы.

Как это работает

try_files — одна из сильных сторон nginx: раздача файлов с диска быстрее почти любого другого варианта. Директивы: root /path (префикс ФС для URI), index index.html, try_files $uri $uri/ =404 (SPA fallback-паттерн), sendfile on, tcp_nopush on, tcp_nodelay on. Cache-заголовки через expires 1y; + add_header Cache-Control "public, immutable". gzip_static on — для раздачи pre-compressed файлов.

Когда применять

Nginx — для статики (HTML, JS, CSS, картинки, шрифты) и fall-through на backend для /api/*. Дальний Cache-Control — на hash-версионированные ассеты (/static/app.a3f4b.js). try_files — для SPA-роутинга: любой неизвестный путь возвращает index.html. Всегда gzip on + gzip_types text/plain text/css application/javascript application/json; рассмотрите Brotli (brotli on) для современных клиентов.

Типичные ошибки

Ловушки try_files: огромные файлы без sendfile on (медленно + высокий CPU); нет Cache-Control (браузеры fetch на каждый запрос); раздача несжатого текста (5× bandwidth-штраф); неверные MIME-типы для шрифтов (браузеры отказывают); долго закешированный HTML указывает на версионированный JS, удалённый при деплое (белая страница). Atomic deploy + Cache-Control: no-store на HTML.

Связанные понятия

Полезные ресурсы