Monitor404

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.

/etc/nginx/conf.d/example.conf
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, включите перехват:

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.

nginx
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:

nginx
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

bash
# самые частые адреса с ответом 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:

404.html
<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.

Читайте также