Como posso desativar fastcgi_intercept_errors para um caminho específico

1

Acabei de criar uma API para meu novo website chamativo e esperava retornar respostas de erro com códigos de status relevantes. No entanto, eu já configurei caminhos normais para usar páginas de erro com a diretiva error_page , que eu preferiria não remover.

Eu tenho um arquivo index.php que lida com todas as solicitações para a API e o site.

server {
    listen 80;
    listen 443 ssl http2;
    server_name ~^(.+)\.flashy\.local$;
    root "/home/vagrant/flashy/core/www";

    index index.html index.htm index.php;

    charset utf-8;

    error_page 400 /error/error-400.html;
    error_page 403 /error/error-403.html;
    error_page 404 /error/error-404.html;
    error_page 500 501 /error/error-500.html;
    error_page 502 503 504 /error/error-503.html;

    location ~ ^/error/error-(403|404|500|503)\.html$ {
       internal;
       root /home/vagrant/flashy;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

         fastcgi_buffer_size 16k;
         fastcgi_buffers 4 16k;
         fastcgi_connect_timeout 300;
         fastcgi_send_timeout 300;
         fastcgi_read_timeout 300;
         fastcgi_intercept_errors on;
     }

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

     access_log off;
     error_log  /var/log/nginx/~^(.+)\.flashy\.local$-error.log error;

     sendfile off;

     client_max_body_size 100m;

     location ~ /\.ht {
         deny all;
     }

     ssl_certificate     /etc/nginx/ssl/~^(.+)\.flashy\.local$.crt;
     ssl_certificate_key /etc/nginx/ssl/~^(.+)\.flashy\.local$.key;


}

Agora, alguns de vocês podem estar se perguntando? O que eu tentei?

Eu tentei adicionar um local /api/ para alterar o parâmetro fastcgi_intercept_errors para desativado, mas ele parece voltar a ser ativado, já que ele vai atingir um arquivo php de qualquer maneira.

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

Eu também tentei uma declaração if para ver se talvez eu poderia combinar isso com base nos cabeçalhos de conteúdo. No entanto, não quero usar if statements se possível, pois parece ser uma má idéia.

     ...
     fastcgi_send_timeout 300;
     fastcgi_read_timeout 300;
     if ($content_type != "application/json") {
          fastcgi_intercept_errors on;
     }
}
...

Minha pergunta é bem parecida com esta pergunta, mas também não tem resposta. Espero que minhas perguntas sejam um pouco diferentes e talvez melhor explicadas?

Como posso desativar o fastcgi_intercept_errors para um caminho de API específico?

    
por Markus Tenghamn 11.08.2017 / 17:06

1 resposta

0

Você precisará duplicar a configuração do FastCGI em um novo location para o URI da API. A maioria das diretivas fastcgi pode ser movida para o bloco server e será herdada pelo bloco location ~ \.php$ e pelo novo bloco location . Consulte este documento para obter detalhes.

Uma correspondência exata location block tem a precedência mais alta, portanto, a ordem dos blocos neste exemplo não é importante (consulte este documento para detalhes):

include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

location = /api/api.php {
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    fastcgi_intercept_errors on;
}

As diretivas fastcgi_split_path_info e fastcgi_index não são relevantes para sua configuração.

    
por 11.08.2017 / 17:41

Tags