Guia de configuração de redirecionamentos no Nginx

Conteúdo

O Nginx é um dos servidores web mais utilizados, e a configuração de redirecionamentos é uma tarefa rotineira ao administrá-lo. As duas ferramentas principais — return e rewrite — são frequentemente confundidas, levando a configurações ineficientes ou quebradas.

return vs rewrite

return (recomendado)

return 301 https://example.com;

rewrite (poderoso, mas mais lento)

rewrite ^/old-path/(.*)$ /new-path/$1 permanent;

💡 Regra geral

Use return sempre que possível. Só recorra ao rewrite quando precisar de grupos de captura com regex ou transformações complexas de URL.

Exemplos básicos

Redirecionamento 301 permanente

server {
    listen 80;
    server_name old-domain.com;
    return 301 https://new-domain.com$request_uri;
}

Redirecionamento 302 temporário

server {
    listen 80;
    server_name example.com;
    location /maintenance {
        return 302 /maintenance.html;
    }
}

Redirecionamento de uma única página

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

HTTP para HTTPS

Recomendado: blocos server separados

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    # configuração do site...
}

⚠️ Evite a diretiva if

A comunidade do Nginx tem um ditado: "if é do mal". A diretiva if pode causar comportamentos inesperados em certos contextos. Use blocos server separados para redirecionamentos HTTPS.

Canonicalização www

sem www → www

server {
    listen 80;
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    return 301 https://www.example.com$request_uri;
}

www → sem www

server {
    listen 80;
    listen 443 ssl http2;
    server_name www.example.com;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    return 301 https://example.com$request_uri;
}

Redirecionamentos de caminho

# Redirecionar um diretório, removendo o prefixo
location /blog/ {
    rewrite ^/blog/(.*)$ /articles/$1 permanent;
}

# Redirecionamentos em massa com map (eficiente para listas grandes)
map $uri $new_uri {
    /old-page-1 /new-page-1;
    /old-page-2 /new-page-2;
}
server {
    if ($new_uri) { return 301 $new_uri; }
}

Redirecionamentos com regex

# Remover extensão .html
location ~ ^(.+)\.html$ {
    return 301 $1;
}

# Remover prefixo de URL baseado em data
location ~ ^/\d{4}/\d{2}/\d{2}/(.+)$ {
    return 301 /$1;
}

Erros comuns

1. Loop de rewrite

# ❌ Loop infinito
location /old/ {
    rewrite ^/old/(.*)$ /new/$1;
}

# ✅ Use o flag permanent ou return
location /old/ {
    return 301 /new$request_uri;
}

2. Perda de query strings

# ❌ Query string perdida
location /old { return 301 /new; }

# ✅ Preservar a query string
location /old { return 301 /new$is_args$args; }

3. Falta de configuração SSL no destino HTTPS

Se você redireciona HTTP → HTTPS mas não configurou o bloco server HTTPS com um certificado válido, os usuários verão um erro de conexão. Sempre verifique se o bloco HTTPS existe e se o certificado é válido antes de ativar o redirecionamento.

Dicas de desempenho

Após configurar os redirecionamentos, verifique-os com o 301check.com.