Это, кажется, делает трюк:
location / { root /home/$user/www; try_files $uri $uri/ =404; error_page 404 /404.html; }
Возможно, вам придется удалить «error_page 404 = @not_found;».
Я создаю конфигурацию «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 существует в пользовательском каталоге, возвращается общая страница nginx 404; если нет, то возвращается /var/www/userdir/404.html.
Это, кажется, делает трюк:
location / { root /home/$user/www; try_files $uri $uri/ =404; error_page 404 /404.html; }
Возможно, вам придется удалить «error_page 404 = @not_found;».
Использование 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; }