Я пытаюсь установить 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
Этот подход кажется мне неэлегантным и непереносимым (я бы проголосовал против, если у меня достаточно репутации, чтобы проголосовать за или против), но он работает.