Recuo da página 404 no nginx

1

Estou criando uma configuração "userdir", na qual o servidor da Web serve arquivos dentro do diretório ~ / www de cada usuário.

Eu tenho o seguinte snippet de configuração:

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;
    }
}

Quando um arquivo não existente é solicitado, o local @not_found é inserido. Primeiro, ele verifica se o usuário tem uma página 404 personalizada e, se tiver, define a raiz do documento para o diretório do usuário antes de tentar veicular 404.html.

No entanto, o resultado do bloco de configuração é que, se 404.html existir no diretório do usuário, a página genérica nginx 404 será retornada; se não, /var/www/userdir/404.html é retornado.

    
por Riccardo Bestetti 20.09.2018 / 20:04

2 respostas

1

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;
}
    
por 20.09.2018 / 21:39
1

Isso parece fazer o truque:

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

Pode ser necessário remover a "error_page 404 = @not_found;"

    
por 20.09.2018 / 21:13

Tags