Redirecionamentos Nginx 301 e 302 num VPS Linux

3 min
Alojamento VPS/VDS

Os redirecionamentos preservam os seus visitantes e o seu posicionamento quando uma página muda de endereço, quando troca de domínio ou quando força o HTTPS. Este guia mostra como escrever redirecionamentos Nginx limpos no seu VPS Linux Infrawire e como testá-los antes de chegarem à produção.

📋 Pré-requisitos

  • Um VPS Linux (Ubuntu 24.04 / Debian 12 ou AlmaLinux 9 / Rocky 9) com acesso SSH root. O IP e a palavra-passe root encontram-se na sua área de cliente.
  • Nginx instalado e a servir pelo menos um site (sudo apt install nginx ou sudo dnf install nginx).
  • Um nome de domínio (example.com) cujos registos DNS A/AAAA apontem para VPS_IP.

🧭 301 ou 302: qual escolher

  • 301 (Moved Permanently): a mudança é definitiva. Os navegadores e os motores de busca guardam-na em cache e transferem o posicionamento para a nova URL.
  • 302 (Found): a mudança é temporária (manutenção, teste A/B). A URL antiga continua a ser a referência.

Na dúvida, comece por um 302: um 301 errado pode ficar muito tempo na cache dos navegadores.

⚙️ return ou rewrite

Prefira return: é mais rápido e legível, porque o Nginx interrompe o processamento de imediato.

Nginx
location = /old-page { return 301 /new-page; }

Use rewrite apenas quando precisar de capturar parte da URL com uma expressão regular:

Nginx
rewrite ^/blog/(\d+)/(.*)$ /articles/$2 permanent;

A flag permanent envia um 301 e redirect envia um 302.

🌐 Redirecionar www para sem www

Crie um bloco server dedicado que apenas redireciona. Edite /etc/nginx/sites-available/example.com (Debian/Ubuntu) ou /etc/nginx/conf.d/example.com.conf (AlmaLinux/Rocky):

Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name www.example.com; 5 return 301 $scheme://example.com$request_uri; 6}

Para o sentido contrário, troque os dois nomes de host. $request_uri mantém o caminho e a query string.

🔒 Redirecionar HTTP para HTTPS

Depois de instalado o certificado, envie todo o tráfego em claro para HTTPS:

Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 return 301 https://example.com$request_uri; 6} 7 8server { 9 listen 443 ssl; 10 listen [::]:443 ssl; 11 http2 on; 12 server_name www.example.com; 13 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 14 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 15 return 301 https://example.com$request_uri; 16}

O site real fica então num terceiro bloco que escuta em 443 com server_name example.com;. Note que http2 on; exige Nginx 1.25.1 ou superior, o que acontece no Ubuntu 24.04.

🔗 De URL antiga para URL nova

Para poucas páginas, use correspondências exatas (=), as mais rápidas:

Nginx
location = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }

Para uma pasta inteira movida, mantendo os subcaminhos:

Nginx
location /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }

🏠 Redirecionar um domínio inteiro

Quando abandona old-example.com por example.com, mantenha todos os caminhos:

Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name old-example.com www.old-example.com; 5 return 301 https://example.com$request_uri; 6}

Se o domínio antigo também tem HTTPS, adicione o bloco listen 443 ssl; correspondente com o seu próprio certificado; caso contrário, os navegadores mostram um erro de certificado antes do redirecionamento.

✅ Testar e recarregar com segurança

Valide sempre a sintaxe antes de recarregar. Um reload mantém as ligações ativas, um restart não.

Bash
sudo nginx -t sudo systemctl reload nginx

Depois verifique os cabeçalhos sem seguir o redirecionamento:

Bash
curl -I http://www.example.com/old-page

Saída esperada (abreviada):

HTTP/1.1 301 Moved Permanently
Server: nginx
Location: https://example.com/old-page

Para seguir toda a cadeia e ver cada salto, use curl -IL http://www.example.com/old-page. O ideal é um único salto: evite cadeias como HTTP, depois www, depois HTTPS.

🛠️ Resolução de problemas

Demasiados redirecionamentos (ciclo). Uma regra corresponde ao seu próprio destino, muitas vezes porque um proxy ou CDN já termina o HTTPS. Verifique o cabeçalho Location com curl -I e confirme que o bloco de destino não volta a redirecionar.

A alteração não tem efeito. Editou um ficheiro não ativado. No Debian/Ubuntu, verifique a ligação em /etc/nginx/sites-enabled/ e execute sudo nginx -t e sudo systemctl reload nginx. Os navegadores também guardam os 301 em cache: teste com curl ou uma janela privada.

Query string perdida. Com rewrite ... ? ou um destino fixo, os parâmetros desaparecem. Use $request_uri em return ou mantenha $args de forma explícita.

Responde o bloco errado. O Nginx escolhe o bloco por server_name. Liste-os com sudo nginx -T | grep server_name e procure duplicados.


🎉 Os seus redirecionamentos estão ativos: permanentes quando é definitivo, temporários quando não, e testados com curl antes de os visitantes notarem alguma coisa.

Fique a par das últimas ofertas, descontos e promoções especiais.

Ver promoções

Utilizamos cookies

Utilizamos cookies analíticos para melhorar a sua experiência no nosso site. Nenhum dado é vendido a terceiros. Saiba mais na nossa política de privacidade.