Справочник

try_files в nginx: что отдать, если файла нет

Директива try_files проверяет файлы по очереди и отдаёт первый найденный. Если ни одного нет, nginx поступает по последнему параметру: передаёт запрос на другой адрес, в именованный location или отвечает кодом ошибки, например 404.

≈ 7 мин чтения
Содержание 10

Что сделать прямо сейчас

  1. Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
  2. Откройте файл сайта: sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажет ls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter.
  3. Найдите строку try_files: Ctrl+W, слово try_files, Enter. В файле сайта по умолчанию она стоит в блоке location /.
  4. Замените строку нужным вариантом из таблицы. Второй блок location / не добавляйте — правьте тот, что уже есть.
  5. Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки: sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их: sudo systemctl reload nginx. Если команда ничего не ответила, настройки применены.

Если проверка нашла ошибку, nginx назовёт файл и номер строки, а сайт продолжит работать на старых настройках. Что значит сообщение — Все ошибки nginx.

Как читать строку try_files

В файле сайта по умолчанию в Ubuntu стоит такая строка:

try_files $uri $uri/ =404;
ПараметрЧто значит
$uriпуть из адреса, например /about.html: nginx ищет такой файл в папке сайта из root
$uri/слэш в конце: проверить, есть ли папка с таким именем
=404ничего не нашлось — ответить кодом 404

nginx проверяет параметры слева направо и берёт первый, который нашёлся. Последний параметр не проверяется — это запасной вариант: адрес, именованный location или код ответа. Параметров должно быть не меньше двух.

Пример. В root указано /var/www/example.com, посетитель открыл /about. nginx ищет файл /var/www/example.com/about, затем папку /var/www/example.com/about/. Нет ни того, ни другого — отвечает 404.

Готовые строки

СайтСтрока в location /
из HTML-файловtry_files $uri $uri/ =404;
из HTML-файлов, адреса без .html: /about открывает about.htmltry_files $uri $uri.html $uri/ =404;
WordPress и другие сайты на PHP, где все адреса обрабатывает index.phptry_files $uri $uri/ /index.php?$args;
сайт-приложение на React, Vue и подобныхtry_files $uri $uri/ /index.html;
приложение на Node.js или Python, картинки и стили лежат на дискеtry_files $uri @app; — подробнее

Строка для WordPress отправляет в index.php все адреса, для которых нет файла, — так работают постоянные ссылки. Для самого /index.php nginx заново выбирает блок location: это должен быть блок для PHP — как его добавить. Если после переезда WordPress открывается только главная — WordPress: открывается только главная.

Строка для сайта-приложения отдаёт index.html на любой адрес, которого нет среди файлов: страницы приложения существуют только в браузере. Подробнее — приложение отдаёт 404 при обновлении.

Что происходит, если нашлась папка

Если параметр $uri/ нашёл папку, а адрес без слэша в конце, например /docs, nginx отвечает переадресацией 301 на /docs/. По адресу со слэшем он ищет в папке индексный файл — по списку из директивы index, например index.html. Нашёл — открывает его так, будто посетитель запросил /docs/index.html.

Если индексного файла в папке нет, посетитель получит 403, а в журнале будет запись directory index of … is forbidden — что с этим делать.

Последний параметр: адрес

Если последний параметр — адрес, nginx делает внутреннее перенаправление: заново выбирает блок location уже для этого адреса. Посетитель этого не видит — адрес в браузере не меняется.

Если файла из последнего параметра тоже нет, перенаправление пойдёт по кругу. nginx прервёт его и ответит 500, а в журнале появится запись rewrite or internal redirection cycle. Проверьте, что index.html или index.php лежит в папке из root.

Файлы с диска, остальное — приложению

Последним параметром можно указать именованный location — блок с именем через @. Так nginx сам отдаёт файлы, которые есть на диске, а остальные запросы передаёт приложению:

location / {
    try_files $uri @app;
}

location @app {
    proxy_pass http://127.0.0.1:3000;
    include proxy_params;
}

Вместо 3000 — порт вашего приложения, имя @app можно выбрать любое. Блок с @ пишут прямо в server, не внутри другого location. В proxy_pass такого блока после порта ничего не добавляют — подробнее в proxy_pass в nginx.

Где писать try_files

try_files пишут в блоке location — там она и работает. Найденный файл nginx отдаёт по правилам того же блока, а не ищет для него другой.

В блоке server try_files тоже можно написать, но в блоки location она не переходит: действует только для запросов, которые не попали ни в один location.

Ошибки и как их исправить

Что видитеЧто делать
WordPress: главная открывается, остальные страницы — 404WordPress: открывается только главная
приложение отдаёт 404, когда обновляешь страницуприложение отдаёт 404 при обновлении
403, в журнале directory index of "…" is forbiddenв папке нет индексного файла
500, в журнале rewrite or internal redirection cycleнет файла из последнего параметра: проверьте root и что index.html или index.php на месте
invalid number of arguments in "try_files" directiveнужно не меньше двух параметров
браузер скачивает файл .php вместо страницынет блока location для PHP

Источники

Сверено 14 октября 2026 года.

Что почитать дальше