Откат на 404 страницы в nginx

373
Riccardo Bestetti

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

1

2 ответа на вопрос

1
Gerard H. Pille

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

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

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

1
Richard Smith

Использование 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; } 
Я не уверен, что полностью понимаю, почему мое решение не работает, даже после прочтения статьи, на которую вы ссылались, и многого другого. Спасибо за предоставление рабочего решения. Riccardo Bestetti 5 лет назад 0