Назад | Перейти на главную страницу

Страница ошибок по умолчанию NGINX

Я пытаюсь установить error_page по умолчанию для всего моего сервера nginx (как и для всех vhosts).

Я пытаюсь использовать следующий код:

http {
    ...
    ...
    error_page 404 /var/www/default/404.html;
    ...
    ...
}

Кроме того, я хотел бы иметь возможность создать виртуальный хост и использовать его по умолчанию 404.html, если я явно не напишу еще один.

Что-то вроде:

server {
    ...
    server_name mydomain.com
    root /var/www/mydomain.com/;
    ...
}

В любом случае, я получаю следующую ошибку:

[error] 16842#0: *1 open() "/var/www/mydomain.com/var/www/default/404.html" failed (2: No such file or directory)

Хотя я понимаю ошибку и понимаю, почему она происходит, я не могу понять, почему я не могу указать NGINX пользователю error_page по умолчанию в качестве абсолютного пути вместо того, чтобы добавлять его в корень моего виртуального хоста.

Есть идеи, как это сделать?

С уважением

Как вы уже обнаружили, error_page директива определяет документ, относящийся к документу root.

Один из способов обойти это - создать отдельный файл, содержащий спецификации страницы ошибок, который содержит соответствующие location блоки, а затем include что от каждого server который будет использовать "глобальный" error_page.

Например, файл /etc/nginx/global404:

location = /404.html {
    root /var/www/default;
}

error_page 404 /404.html;

Теперь в каждом server блок, вы:

include global404;

Похоже, что error_page наследуется только в том случае, если нет других директив error_page в server / location. Итак, чтобы сбросить error_page 404 для вашего сервера, просто установите другую страницу ошибки, например:

server {
  error_page 399 /;
}

Этот сервер не будет наследовать error_page 404 (и любые другие) от блока 'html'.

Я планирую использовать include подход, представленный ранее, но для полноты, альтернатива: используйте символические ссылки. Он по-прежнему требует дополнительной операции для каждого виртуального хоста, которым вы управляете, но он дает преимущество в том, что не требует дополнительных изменений конфигурации и перезапусков сервера.

http {
    ...
    ...
    error_page 404 /error/404.html;
    ...
    ...
}

... а затем в корне каждого виртуального хоста ...

ln -s [path to error page html directory] /[vhost root]/error

Этот подход кажется мне неэлегантным и непереносимым (я бы проголосовал против, если у меня достаточно репутации, чтобы проголосовать за или против), но он работает.