nginx página de erro 404 personalizada para o host virtual

2

Estou executando alguns hosts virtuais do nginx, e gostaria que eles tivessem suas próprias páginas 404 personalizadas. Cada host virtual tem seu próprio nginx.conf que incluo meu nginx.conf global.

Dentro do arquivo de configuração do host virtual em particular que atualmente não consigo trabalhar direito, o bloco de configuração é assim:

server{
    listen 80;
    server_name www.foo.com;
    expires     1M;
    access_log  /srv/www/foo/logs/acces.log;
    error_log   /srv/www/foo/logs/error.log;

    error_page 404 /404.html;

    location / {
        root    /srv/www/foo/public_html;
        index   index.html;
        rewrite ^/(.*)/$ /$1 permanent;
        try_files "${uri}.html" $uri $uri/ =404;
    }

    location = /404.html {
        internal;
    }       
}

404'ing é bom, mas quando um código de status 404 é retornado, a página 404 padrão do nginx é exibida e não a página personalizada 404.html, que reside na raiz do site.

Eu testei o caminho absoluto por meio do sistema de arquivos e do URI do site para a página de erro, e tentei colocar a diretiva error_page no bloco de localização. Nenhum desses funcionou. Minha suspeita é que o problema está vindo do meu combo reescrever e try_files que estou usando para "embelezar" meus URLs.

    
por Doug Stephen 29.01.2012 / 19:33

1 resposta

3

Primeiramente, defina sua diretiva raiz fora do bloco de localização - neste caso, acima da diretiva error_page -. Veja a página de armadilhas do nginx. A razão para isso é que muitas diretivas (incluindo error_page) precisam conhecer caminhos relativos a algo - e todos os caminhos são supostos como relativos (ou seja, /404.html não está na raiz do seu sistema de arquivos - é relativo ao seu documento). raiz).

server{
    #listen 80; - not needed
    server_name www.foo.com;
    root    /srv/www/foo/public_html;
    expires     1M;
    access_log  /srv/www/foo/logs/access.log;
    error_log   /srv/www/foo/logs/error.log;

    error_page 404 /404.html;

    location / {
        index   index.html;
        rewrite ^/(.*)/$ /$1 permanent;
        try_files "${uri}.html" $uri $uri/ =404;
    }

    location = /404.html {
        internal;
    }       
}

Se o acima não resolver o erro, aumente o detalhamento de seu error_log (por exemplo, para 'informações') e veja qual página o nginx está realmente servindo quando você atinge um 404.

    
por 30.01.2012 / 01:00