404 и редиректы в nginx: error_page и return 301
В nginx страницу 404 задают директивой error_page 404 /404.html;, а постоянные редиректы делают через return 301 … в нужном location или server. Для сотен адресов используют map.
Обновлено 11 октября 2026 г.
Страница 404 через error_page
Директива error_page связывает код ошибки с адресом, который покажет nginx. Её можно писать в блоках http, server и location.
server {
listen 80;
server_name example.com;
root /var/www/example;
error_page 404 /404.html;
location = /404.html {
internal;
}
location / {
try_files $uri $uri/ =404;
}
}error_page 404 /404.html;делает внутренний переход на/404.html, при этом клиент всё равно получает статус 404.location = /404.html— точное совпадение;internalзапрещает открывать этот адрес напрямую снаружи.try_files … =404явно возвращает 404, если файла нет.
Запись вида error_page 404 =200 /404.html; меняет статус на 200: получится soft 404. Используйте =код только осознанно. Подробнее — про soft 404.
Ошибки upstream: 404, 502, 503
Если nginx проксирует запросы на приложение (proxy_pass, fastcgi_pass), по умолчанию ответы приложения со статусом 404 передаются клиенту как есть. Чтобы показать единую страницу nginx, включите перехват:
proxy_intercept_errors on; # для fastcgi: fastcgi_intercept_errors on;
error_page 404 /404.html;
error_page 502 503 504 /50x.html;
location = /50x.html { internal; }Страница /50x.html пригодится при 502, 503 и 504: без неё пользователь видит стандартную заглушку nginx. Если 502 появляется у вас, проверьте, запущен ли upstream-процесс, и посмотрите error.log.
301-редиректы в nginx
Для одного адреса используйте location = и return 301. Это быстрее и безопаснее, чем rewrite.
server {
# http -> https
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
# ssl_certificate ...
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
location = /old-page {
return 301 /new-page;
}
location /old-section/ {
return 301 /new-section/;
}
# с переносом хвоста пути
rewrite ^/blog/(.*)$ /articles/$1 permanent;
}return 301 URL;— отправляет ответ сразу;$request_uriсохраняет путь и параметры.rewrite … permanent;отвечает 301, если нужно подставить часть пути из регулярного выражения.location =— точное совпадение,location /— префикс,~— регулярное выражение. Порядок выбора location описан в документации nginx; точное совпадение побеждает.
Массовые редиректы через map
Когда адресов много, не пишите по location на каждый. Составьте таблицу в map (только в контексте http) и сделайте один return:
map $request_uri $redirect_target {
default "";
/old-page /new-page;
/old-page/ /new-page/;
/catalog/item-1 /catalog/item-one;
~^/blog/(?<slug>[^/]+)/?$ /articles/$slug;
}
server {
# ...
if ($redirect_target) {
return 301 $redirect_target;
}
}$request_uri содержит путь вместе с параметрами запроса, так что ключи без ?… совпадут только при запросе без параметров. Если параметры важны, ориентируйтесь на $uri. Готовые блоки для map выгружает генератор редиректов. Для нескольких тысяч адресов вынесите таблицу в отдельный файл и подключите include.
Частые ошибки
try_files $uri /index.htmlдля сайта, где не все адреса существуют: любой мусорный URL отвечает 200.- Редирект без
$request_uriили с$uri: теряются параметры запроса. return 301внутриlocation /, когда целевой URL тоже под этим location: цикл и ошибка слишком большого числа редиректов.- Забыли
internalу служебных страниц:/404.htmlоткрывается напрямую с кодом 200. - Не перечитали конфиг: после правки нужно выполнить
nginx -tиnginx -s reload. - Неправильный
rootили права на файлы: nginx пишет вerror.log«open() … failed (2: No such file…)» и отдаёт 404 на существующую страницу.
Как найти 404 в логах nginx
# самые частые адреса с ответом 404 (формат combined)
awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -30В выводе будет много ботов: /wp-login.php, /.env, /.git/config. Оставьте в работе только адреса, на которые приходят живые посетители или поисковые системы. Проверить цепочку ответов для отдельного URL можно в проверке HTTP-статуса.
Подключение Monitor404 к nginx
Добавьте скрипт в файл /404.html, который показывает error_page:
<script src="https://collect.monitor404.ru/collect/ВАШ_ТОКЕН/script.js" async></script>Monitor404 покажет, какие битые адреса открывали люди, отделит их от ботов и предложит цель для 301. Готовые правила map для nginx можно выгрузить из сервиса.
Частые вопросы
Как настроить страницу 404 в nginx?
Укажите error_page 404 /404.html; и добавьте location = /404.html { internal; }. Файл 404.html должен лежать в root сайта. Затем выполните nginx -t и nginx -s reload.
Как сделать 301 редирект в nginx?
Внутри server или location пропишите return 301 https://example.com/new-url;. Для сохранения пути и параметров используйте $request_uri.
Что значит 404 Not Found nginx?
Сервер не нашёл ресурс по запрошенному адресу. Если сайт точно должен открываться, проверьте root, try_files, права на файлы, имя server_name и error.log — там указан путь, по которому nginx искал файл.
Как сделать редирект большого списка URL в nginx?
Используйте map $request_uri $redirect_target { … } в блоке http и один if ($redirect_target) { return 301 $redirect_target; } в server.