Я создаю конфигурацию "userdir", где веб-сервер обслуживает файлы в каталоге ~/www каждого пользователя.
У меня есть следующий фрагмент конфигурации:
server {
listen 443;
listen [::]:433;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
server_name ~^(?<user>\w+)\.example\.com$;
root /var/www/userdir;
index index.html;
error_page 404 = @not_found;
add_header X-User $user;
location / {
root /home/$user/www;
try_files $uri $uri/ =404;
}
location @not_found {
if (-f /home/$user/www/404.html)
{
root /home/$user/www;
}
try_files /404.html =500;
}
}
Когда запрашивается несуществующий файл, вводится имя с именем @not_found
. Сначала он проверяет, есть ли у пользователя настраиваемая страница 404, и, если он (она), он устанавливает корневой каталог документа в каталог пользователя, прежде чем пытаться обслуживать 404.html.
Тем не менее, результатом блока конфигурации является то, что если 404.html существует в пользовательском каталоге, возвращается общая страница 404 nginx; если нет, то возвращается /var/www/userdir/404.html.