Статический сайт на Nginx: правильные 404

Отдаём файлы и не маскируем отсутствующие страницы главной.

У статического блога каждая статья может быть отдельным каталогом с index.html. Для такого сайта не нужен сервер приложения: достаточно сопоставить URL с файлом. Важно при этом не превращать любой неизвестный адрес в успешный ответ с главной страницей.

Минимальная конфигурация

Этот server-блок предназначен для включения внутри http-контекста Nginx. Пример использует тестовое имя: замените его своим доменом.

nginx
server {
    listen 80;
    server_name blog.example.com;
    root /var/www/notebook;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    location = /404.html {
        internal;
    }
}

Положите index.html в корень, а статью — например, в posts/first/index.html. Для неизвестного пути Nginx вернёт 404 и покажет подготовленную страницу ошибки.

Почему не fallback на главную

Конструкция с последним аргументом /index.html полезна для некоторых SPA. Но в обычном блоге она скрывает опечатки в ссылках: пользователь получает главную, а мониторинг видит 200. Настоящая ошибка маршрута остаётся незаметной.

Проверка после изменения

bash
sudo nginx -t
sudo systemctl reload nginx
curl -I http://blog.example.com/
curl -I http://blog.example.com/does-not-exist

Перезагрузку выполняйте только после успешной проверки конфигурации. Ожидаемые статусы — 200 и 404 соответственно. Если вместо страницы появляется 403, проверьте наличие index.html и права чтения файлов и прохода по родительским каталогам.

Проверяйте ещё и реальную статью: работающая главная не доказывает, что вложенные пути и ссылки на CSS настроены правильно. HTTPS подключается отдельно, когда домен уже указывает на сервер.

Документация

Nginx: root, index и try_files ↗