try_files в nginx: что отдать, если файла нет
Директива try_files проверяет файлы по очереди и отдаёт первый найденный. Если ни одного нет, nginx поступает по последнему параметру: передаёт запрос на другой адрес, в именованный location или отвечает кодом ошибки, например 404.
Содержание 10
Что сделать прямо сейчас
- Команды вводятся на сервере: подключитесь к нему по SSH ([как подключиться](/instrukcii/kak-podklyuchitsya-k-vps-po-ssh/)) и набирайте их в том же окне.
- Откройте файл сайта:
sudo nano /etc/nginx/sites-available/example.com. Вместо example.com — имя файла вашего сайта: список покажетls /etc/nginx/sites-enabled/. Если система спросит пароль, введите пароль своего пользователя на сервере. Символы при вводе не видны — наберите пароль и нажмите Enter. - Найдите строку try_files: Ctrl+W, слово
try_files, Enter. В файле сайта по умолчанию она стоит в блокеlocation /. - Замените строку нужным вариантом из таблицы. Второй блок
location /не добавляйте — правьте тот, что уже есть. - Сохраните файл — 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.html | try_files $uri $uri.html $uri/ =404; |
| WordPress и другие сайты на PHP, где все адреса обрабатывает index.php | try_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: главная открывается, остальные страницы — 404 | WordPress: открывается только главная |
| приложение отдаёт 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 |
Источники
- Документация nginx: try_files — проверка файлов по порядку, слэш в конце для папки, последний параметр — адрес, именованный location или код.
- Исходный код nginx 1.24.0: ngx_http_try_files_module.c — слэш в конце параметра включает проверку папки; своего слияния настроек у модуля нет, поэтому try_files из server не переходит в location.
- Документация nginx: модуль ngx_http_index_module — индексный файл ищется по порядку из списка index, найденный открывается внутренним перенаправлением.
- Исходный код nginx 1.24.0: ngx_http_core_module.c — текст rewrite or internal redirection cycle и код 500, когда внутренние перенаправления идут по кругу.
- Файл sites-available/default из пакета nginx в Ubuntu 24.04 — сайт по умолчанию:
listen 80 default_server,server_name _, try_files. - Документация WordPress: nginx — try_files с передачей адресов в index.php.
Сверено 14 октября 2026 года.
Что почитать дальше
- Настройки nginxкак устроены файлы и блоки, главные директивы.
- root и alias в nginxв какой папке nginx ищет файлы.
- location в nginxкак выбирается блок для адреса.
- proxy_pass в nginxкак передать запросы приложению.
- 404 Not Foundвсе причины и как найти нужную по журналу.
- 403 Forbiddenесли nginx запрещает доступ.