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:
-
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
. -
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.
-
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.