NGINX
#nginx#error#404#500#error_page#custom

Nginx: кастомные страницы ошибок (error_page)

Настройка кастомных страниц ошибок 404, 500, 502, 503 в nginx через директиву error_page. Внутренние и внешние редиректы.

Настройка кастомных страниц ошибок в nginx через директиву error_page. Поддержка внутренних и внешних редиректов.

Базовый пример

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Кастомная страница 404
    error_page 404 /404.html;
    
    # Кастомная страница 500
    error_page 500 502 503 /50x.html;

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

    # Внутренний location для страницы ошибки
    location = /404.html {
        internal;
        root /var/www/html;
    }

    location = /50x.html {
        internal;
        root /var/www/html;
    }
}

Внешний редирект на страницу ошибки

server {
    listen 80;
    server_name example.com;

    # Внешний редирект (браузер получит новый URL)
    error_page 404 https://example.com/custom-404;
    error_page 500 502 503 https://example.com/error;
}

Внутренний редирект с изменением кода ответа

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Внутренний редирект, но возвращаем код 200 вместо 404
    error_page 404 =200 /index.html;

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

Обработка ошибок проксирования

server {
    listen 80;
    server_name example.com;

    location /api/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        
        # Обработка ошибок от backend
        error_page 502 503 504 /50x.html;
    }

    location = /50x.html {
        internal;
        root /var/www/html;
    }
}

Полный пример с разными кодами ошибок

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Разные страницы для разных ошибок
    error_page 404 /404.html;
    error_page 403 /403.html;
    error_page 500 502 503 504 /50x.html;

    # Внутренние location для страниц ошибок
    location = /404.html {
        internal;
        expires -1;
        add_header Cache-Control "no-cache";
    }

    location = /403.html {
        internal;
        expires -1;
    }

    location = /50x.html {
        internal;
        expires -1;
    }

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

Usage:

Добавьте error_page в server block. Используйте internal для внутренних location, чтобы страницы ошибок не были доступны напрямую по URL.

Notes:

⚠️ internal означает, что location доступен только для внутренних редиректов nginx. Без internal страница ошибки будет доступна по прямому URL. =200 в error_page 404 =200 /index.html меняет код ответа на 200 (полезно для SPA).