Como Ler um Header Personalizado de um Servidor Upstream no Nginx?

Publicado 17 de outubro de 2024

Problema: Lendo Cabeçalhos Personalizados de Servidores Upstream no Nginx

O Nginx, um servidor web e proxy reverso, às vezes precisa acessar cabeçalhos personalizados de servidores upstream. Esses cabeçalhos podem conter informações importantes para o processamento de requisições ou para registros. Por padrão, o Nginx não expõe ou repassa automaticamente todos os cabeçalhos upstream, o que pode ser um problema para administradores que precisam desses dados.

Solução do Nginx para Ler Cabeçalhos Personalizados

Usando Variáveis do Nginx para Acesso aos Cabeçalhos

O Nginx oferece uma maneira de acessar cabeçalhos personalizados de servidores upstream. Este método usa variáveis do Nginx, que são valores que podem ser usados em diferentes partes da configuração do Nginx.

Para acessar cabeçalhos personalizados, o Nginx usa um prefixo: $senthttp. Este prefixo permite criar variáveis que correspondem a cabeçalhos específicos enviados pelo servidor upstream. O prefixo é seguido pelo nome do cabeçalho que você deseja acessar, com os hífens substituídos por sublinhados.

Por exemplo, para acessar um cabeçalho personalizado chamado "My-Custom-Header", você usaria a variável do Nginx $sent_http_My_Custom_Header. Esta variável conterá o valor do "My-Custom-Header" enviado pelo servidor upstream.

Este método funciona para qualquer cabeçalho personalizado, tornando-o uma ferramenta útil para administradores do Nginx que precisam trabalhar com diferentes tipos de respostas de servidores upstream.

Exemplo: Registrando Cabeçalhos Personalizados

Para registrar o valor de um cabeçalho personalizado no log de acesso do Nginx, você pode adicioná-lo à diretiva log_format em sua configuração do Nginx:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$sent_http_My_Custom_Header"';

access_log /var/log/nginx/access.log custom;

Esta configuração incluirá o valor do "My-Custom-Header" em cada entrada de log.

Guia Passo a Passo para Ler Cabeçalhos Personalizados

Identifique o Cabeçalho Personalizado

Para ler cabeçalhos personalizados no Nginx, você precisa encontrar o cabeçalho na resposta do servidor upstream. Cabeçalhos personalizados são frequentemente adicionados pelo servidor upstream (como Apache ou um servidor de aplicação) para fornecer informações extras.

Neste exemplo, o cabeçalho personalizado é:

My-custom-header: 1

Este cabeçalho faz parte da resposta HTTP do servidor upstream. Observe o nome e o formato do cabeçalho personalizado, pois você precisará dessas informações para acessá-lo no Nginx.

Dica: Convenções de Nomenclatura de Cabeçalhos

Ao criar cabeçalhos personalizados, use uma convenção de nomenclatura consistente. Uma prática comum é prefixar seus cabeçalhos personalizados com 'X-' (por exemplo, X-My-Custom-Header). Isso ajuda a distingui-los dos cabeçalhos HTTP padrão e evita possíveis conflitos.

Construa a Variável do Nginx

Depois de encontrar o cabeçalho personalizado, você precisa criar a variável correta do Nginx para acessar seu valor. O Nginx usa um formato específico para variáveis que representam cabeçalhos de resposta:

  1. Comece com o prefixo $sent_http_
  2. Adicione o nome do cabeçalho, substituindo hífens por sublinhados
  3. O nome da variável não é sensível a maiúsculas e minúsculas

Para o cabeçalho personalizado "My-custom-header", a variável correta do Nginx seria:

$sent_http_My_custom_header

Esta variável conterá o valor do "My-custom-header" enviado pelo servidor upstream. Neste caso, ela conteria o valor "1".

Implementando o Cabeçalho Personalizado na Configuração do Nginx

Adicionando o Cabeçalho ao Bloco de Localização do Nginx

Para usar a variável do cabeçalho personalizado em um bloco de localização, adicione-a ao seu arquivo de configuração do Nginx. Isso permite que você acesse o valor do cabeçalho dentro dessa localização.

Aqui está como usar a variável do cabeçalho personalizado em um bloco de localização:

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    # Acessa o valor do cabeçalho personalizado
    add_header X-Custom-Header-Value $sent_http_My_custom_header;
}

Nesta configuração, o valor do cabeçalho personalizado "My-custom-header" do servidor upstream é adicionado à resposta enviada ao cliente usando a diretiva add_header.

Dica: Registre Cabeçalhos Personalizados

Para solucionar problemas ou monitorar cabeçalhos personalizados, você pode registrá-los no log de acesso do Nginx:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$sent_http_My_custom_header"';

access_log /var/log/nginx/access.log custom;

Isso incluirá o valor do cabeçalho personalizado em cada entrada de log, facilitando o rastreamento e a depuração.

Usando Cabeçalhos Personalizados em Declarações Condicionais

Você pode usar valores de cabeçalhos personalizados em declarações condicionais em sua configuração do Nginx. Isso permite que você tome decisões com base no valor do cabeçalho.

Aqui estão exemplos de uso de cabeçalhos personalizados em lógica condicional:

  1. Redirecionando com base no valor do cabeçalho:
location / {
    if ($sent_http_My_custom_header = "1") {
        return 301 /special-page;
    }
    # O processamento regular continua aqui
}
  1. Modificando a resposta com base no valor do cabeçalho:
location / {
    proxy_pass http://backend;

    if ($sent_http_My_custom_header = "premium") {
        add_header X-User-Type "Premium";
    }
}
  1. Controlando o acesso com base no valor do cabeçalho:
location /restricted {
    if ($sent_http_My_custom_header != "authorized") {
        return 403;
    }
    # O acesso autorizado continua aqui
}

Estes exemplos mostram como você pode usar o valor do cabeçalho personalizado para controlar o comportamento do seu servidor Nginx, permitindo configurações mais complexas e dinâmicas baseadas nas respostas do servidor upstream.