Ignora a configuração do erro_page do servidor nginx para uma diretiva de localização específica

2

Eu tenho páginas de erro estático configuradas para o meu servidor, mas eu quero ignorar aquelas para URLs que começam com /api/ , então o manipulador lá pode responder com um código não-200, mas não retornar a página de erro estático. p>

Aqui está a configuração existente:

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  example.com;
    root         /var/www/html/;
    index        index.php;

    error_log    /var/log/nginx/error.log;
    access_log   /var/log/nginx/access.log;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_intercept_errors on;
        fastcgi_index app.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 600;
    }

    error_page 404 /error/404.html;
    error_page 500 502 503 504 /error/50x.html;
    location ^~ /error/ {
        root /usr/share/nginx/html/;
    }
}

Então, eu quero adicionar um novo local como:

location /api/ {
}

Mas não tenho certeza do que usar para dizer a ele que não siga a regra error_page do servidor.

    
por Ben Burleson 08.03.2017 / 01:10

3 respostas

1

Tudo bem, eu estava lutando com a mesma coisa, mas consegui encontrar a solução (a?).

No nível mais alto que eu tenho:

server {

    include /etc/nginx/boilerplate/fancyerror_and_intercept.conf;


    location ~ (?<target>.*) {
        proxy_pass http://$backend;
    }

}

/etc/nginx/boilerplate/fancyerror_and_intercept.conf contém:

error_page 404 /40x.html;
error_page 403 /40x.html;
error_page 405 /40x.html;
error_page 500 /50x.html;
error_page 501 /50x.html;
error_page 502 /50x.html;
error_page 503 /50x.html;


location = /40x.html {
    root /etc/nginx/error_pages;
}
location = /50x.html {
    root /etc/nginx/error_pages;
}


more_set_headers -s '404 403 405 500 501 502 503 504' 'X-Robots-Tag: noindex, nofollow';
proxy_intercept_errors on;

Para excluir a rota /api/ (a localização começa com /api/ e pode conter qualquer coisa depois), adicione o seguinte:

location ~ ^/api/ {
    error_page 527 error.html;
    proxy_intercept_errors off;
    proxy_pass http://$backend;
}

Em essência, o /api/ location é uma duplicata do local geral, mas com error_page redefinido e interceptar os erros definidos como off.

Isso funciona porque, como Tim declarou anteriormente , a diretiva error_page redefine todas as error_pages predefinidas. Eu escolhi o código de erro 527 , porque não usamos CloudFlare veja a Wikipedia, Lista de códigos de status HTTP # Cloudflare . Como proxy_pass de nossos pedidos, sua milhagem pode variar e você pode ter que alterar o proxy_intercept_errors off; para fastcgi_intercept_errors off; .

    
por 16.01.2018 / 12:09
0

A documentação diz

These directives are inherited from the previous level if and only if there are no error_page directives defined on the current level.

Isso sugere que você só precisa definir uma error_page para um código no qual não está interessado e o restante deve ser redefinido. As postagens do fórum suportam isso.

location /api {
  error_page 499 error.html
}

Experimente, informe o que você achou.

    
por 08.03.2017 / 02:03
0

Você pode usar isto:

location /api {
    try_files $uri $uri/ /path/to/api/handler;
}

Desta forma, o nginx primeiro verificará os arquivos reais existentes no diretório /api e, se nenhuma correspondência for encontrada, passará o processamento para o manipulador que você deseja usar.

    
por 08.03.2017 / 10:31

Tags