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 nginxousudo dnf install nginx). - Um nome de domínio (
example.com) cujos registos DNS A/AAAA apontem paraVPS_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.
Nginxlocation = /old-page { return 301 /new-page; }
Use rewrite apenas quando precisar de capturar parte da URL com uma expressão regular:
Nginxrewrite ^/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):
Nginx1server { 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:
Nginx1server { 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:
Nginxlocation = /about-us.html { return 301 /about; } location = /promo { return 302 /offers/current; }
Para uma pasta inteira movida, mantendo os subcaminhos:
Nginxlocation /docs/ { rewrite ^/docs/(.*)$ /help/$1 permanent; }
🏠 Redirecionar um domínio inteiro
Quando abandona old-example.com por example.com, mantenha todos os caminhos:
Nginx1server { 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.
Bashsudo nginx -t sudo systemctl reload nginx
Depois verifique os cabeçalhos sem seguir o redirecionamento:
Bashcurl -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.