1

Я создаю конфигурацию "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.

2 ответа2

1

Это, кажется, делает трюк:

location / {
    root /home/$user/www;
    try_files $uri $uri/ =404;
    error_page 404 /404.html;
}

Возможно, вам придется удалить «error_page 404 = @not_found;».

1

Использование if в блоке location является интуитивно понятным, как показано в этом документе . Также, используя error_page с именованным местоположением, изменяет код ответа с 404 на 200, что может быть нежелательно.

Вы можете использовать свой тест, чтобы установить переменную в верхней части блока server , которая затем может быть использована для установки местоположения файла страницы ошибок.

Например:

set $ERROR_ROOT "/var/www/userdir";
if (-f /home/$user/www/404.html) {
    set $ERROR_ROOT "/home/$user/www";
}

error_page 404 /404.html;

location / {
    root /home/$user/www;
    try_files $uri $uri/ =404;
}

location = /404.html {
    root $ERROR_ROOT;
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .