Usar if
dentro de um bloco location
é contra-intuitivo, como este documento ilustra. Além disso, usando error_page
com um local nomeado, altera o código de resposta de 404 para 200, o que pode não ser desejável.
Você pode usar seu teste para definir uma variável na parte superior do bloco server
, que pode ser usado para definir o local do arquivo da página de erro.
Por exemplo:
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;
}