Como adicionar um cabeçalho de resposta personalizado no Nginx com proxy_pass?

Publicado 17 de outubro de 2024

Problema: Adicionando Cabeçalhos de Resposta Personalizados com Nginx e Proxy_Pass

Adicionar cabeçalhos de resposta personalizados no Nginx ao usar proxy_pass pode ser complicado. Essa configuração é frequentemente necessária para adicionar informações específicas ou alterar a resposta de um servidor upstream antes que ela chegue ao cliente.

Usando add_header com Proxy_Pass

Configurando o Nginx para Cabeçalhos Personalizados

A diretiva add_header no Nginx funciona com proxy_pass, permitindo adicionar cabeçalhos personalizados às respostas de servidores upstream. Esse recurso é útil para adicionar informações extras ou alterar a resposta antes que ela chegue ao cliente.

Para usar add_header com proxy_pass, inclua-o no mesmo bloco de localização que sua diretiva proxy_pass. Aqui está uma configuração de exemplo do Nginx:

server {
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        add_header X-Custom-Header "Valor Personalizado";
    }
}

Nesta configuração, o Nginx adicionará o X-Custom-Header com o valor "Valor Personalizado" a todas as respostas do backend_server. Este cabeçalho estará na resposta enviada ao cliente, independentemente de ter sido gerado pelo Nginx ou pelo servidor upstream.

A diretiva add_header se aplica ao nível atual e a todos os níveis inferiores, a menos que seja sobrescrita. Se você quiser adicionar cabeçalhos apenas para localizações específicas, coloque a diretiva add_header no bloco de localização apropriado.

Dica: Cabeçalhos Condicionais

Você pode usar variáveis do Nginx para adicionar cabeçalhos condicionalmente. Por exemplo:

location / {
    proxy_pass http://backend_server;
    add_header X-Response-Time $request_time;
    add_header X-Cache-Status $upstream_cache_status;
}

Esta configuração adiciona o tempo de resposta e o status do cache como cabeçalhos personalizados, fornecendo informações úteis para depuração.

Implementando a Solução

Guia Passo a Passo

Para adicionar cabeçalhos personalizados ao usar proxy_pass no Nginx, siga estes passos:

  1. Edite o arquivo de configuração do Nginx: Abra o arquivo de configuração do Nginx com um editor de texto. O arquivo geralmente está em /etc/nginx/nginx.conf ou /usr/local/nginx/conf/nginx.conf.

  2. Adicione a diretiva add_header: No bloco server ou location, adicione a diretiva add_header. Coloque-a após a diretiva proxy_pass para aplicá-la às respostas proxy.

  3. Defina o cabeçalho personalizado e seu valor: Defina o nome e o valor do seu cabeçalho personalizado usando a diretiva add_header. A sintaxe é:

    add_header <nome_do_cabeçalho> <valor_do_cabeçalho>;

Aqui está um exemplo de como sua configuração pode ficar:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        add_header X-Custom-Header "Valor Personalizado";
        add_header X-Served-By $hostname;
    }
}

Neste exemplo, dois cabeçalhos personalizados são adicionados:

  • X-Custom-Header com um valor estático "Valor Personalizado"
  • X-Served-By com o valor da variável $hostname, que contém o nome do servidor Nginx

Após fazer essas alterações, salve o arquivo de configuração e recarregue o Nginx para aplicar as novas configurações:

sudo nginx -t
sudo nginx -s reload

O primeiro comando verifica erros de sintaxe na configuração, enquanto o segundo recarrega o Nginx com a nova configuração.

Dica: Usando Variáveis em Cabeçalhos Personalizados

Você pode usar variáveis do Nginx em seus cabeçalhos personalizados para adicionar informações dinâmicas. Por exemplo:

add_header X-Request-ID $request_id;
add_header X-Client-IP $remote_addr;

Esses cabeçalhos incluirão o ID único da requisição e o endereço IP do cliente, respectivamente.

Opções de Configuração Avançadas

Usando o Parâmetro 'always'

O parâmetro 'always' na diretiva add_header do Nginx permite adicionar cabeçalhos personalizados a todas as respostas, incluindo respostas de erro. Esse recurso é útil quando você deseja que seus cabeçalhos personalizados estejam em todas as respostas, independentemente do código de status.

Por padrão, o Nginx adiciona cabeçalhos personalizados apenas a respostas bem-sucedidas (códigos de status 2xx e 3xx). Para incluir cabeçalhos personalizados em respostas de erro (códigos de status 4xx e 5xx), use o parâmetro 'always'.

Veja como usar o parâmetro 'always':

location / {
    proxy_pass http://backend_server;
    add_header X-Custom-Header "Valor Personalizado" always;
}

Nesta configuração, o X-Custom-Header será adicionado a todas as respostas, incluindo respostas de erro.

Você pode usar o parâmetro 'always' com múltiplos cabeçalhos:

location / {
    proxy_pass http://backend_server;
    add_header X-Custom-Header1 "Valor1" always;
    add_header X-Custom-Header2 "Valor2" always;
    add_header X-Server-Name $hostname always;
}

Esta configuração adiciona três cabeçalhos personalizados a todas as respostas, incluindo aquelas com códigos de status de erro.

Dica: Cabeçalhos Condicionais com 'always'

Você pode combinar o parâmetro 'always' com declarações condicionais para maior controle:

location / {
    proxy_pass http://backend_server;
    add_header X-Cache-Status $upstream_cache_status always;
    if ($status = 404) {
        add_header X-Error-Type "Não Encontrado" always;
    }
}

Esta configuração adiciona o cabeçalho X-Cache-Status a todas as respostas e um cabeçalho X-Error-Type apenas para erros 404.

Exemplo: Usando 'always' para Cabeçalhos de Segurança

Para melhorar a segurança, você pode usar o parâmetro 'always' para adicionar cabeçalhos de segurança importantes a todas as respostas:

server {
    listen 80;
    server_name example.com;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self';" always;

    location / {
        proxy_pass http://backend_server;
    }
}

Este exemplo adiciona vários cabeçalhos de segurança a todas as respostas, ajudando a proteger contra vulnerabilidades web comuns.

Lembre-se de que usar o parâmetro 'always' pode mostrar informações sensíveis em respostas de erro. Revise seus cabeçalhos personalizados para evitar o vazamento de dados sensíveis.