Настройка кастомных страниц ошибок (404, 502, 503) в Nginx и Apache
- Пользователи видят стандартную страницу-заглушку веб-сервера (
502 Bad Gatewayили404 Not Found nginx), раскрывающую версию сервера. - Nginx перезаписывает статус ответа бэкенда на 200 OK при показе кастомной страницы ошибки.
- Циклические редиректы при попытке загрузить изображения или CSS-стили для страницы ошибки.
1. Настройка кастомных страниц в Nginx
В блоке server задайте пути к статическим страницам:
server {
listen 80;
server_name example.com;
root /var/www/html;
# Определение страниц для кодов 404 и линейки 50x
error_page 404 /errors/404.html;
error_page 500 502 503 504 /errors/50x.html;
# Защищенный location для статики ошибок
location ^~ /errors/ {
root /var/www;
internal; # Доступ запрещен для прямых HTTP-запросов
}
}2. Перехват ошибок от проксируемого бэкенда
Если ошибки 502 генерирует бэкенд (Node.js/PHP), включите их перехват в Nginx:
location / {
proxy_pass http://backend_app;
proxy_intercept_errors on;
fastcgi_intercept_errors on;
}3. Настройка страниц ошибок в Apache (ErrorDocument)
В конфигурационном файле VirtualHost или в .htaccess:
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html
ErrorDocument 502 /errors/502.html
ErrorDocument 503 /errors/503.html4. Валидация и перезагрузка
nginx -t && systemctl reload nginx
apachectl configtest && systemctl reload apache2 Частые вопросы (FAQ)
Зачем нужна директива internal в блоке location /errors/?
Директива internal запрещает внешним пользователям открывать страницу /errors/404.html напрямую через браузер. Страница будет отображаться только в результате внутреннего перенаправления сервера при ошибке.
Почему Nginx отдает кастомную страницу с кодом HTTP 200 вместо 404?
Это происходит, если в error_page указан знак равенства (=), например: error_page 404 =200 /404.html. Не используйте подмену кода, если хотите сохранить корректный HTTP-статус для поисковых систем.