Guia de configuração de redirecionamentos no Apache
Conteúdo
Os redirecionamentos no Apache são configurados principalmente através de arquivos .htaccess e do módulo mod_rewrite. Isso é especialmente útil em hospedagem compartilhada onde você não tem acesso à configuração principal do servidor.
Conceitos básicos do .htaccess
.htaccess é o arquivo de configuração por diretório do Apache. Coloque-o na raiz do seu site e o Apache o lerá automaticamente. O nome do arquivo começa com um ponto — é um arquivo oculto em sistemas Unix.
Habilitar mod_rewrite
# Ubuntu/Debian
sudo a2enmod rewrite
sudo systemctl restart apache2
# CentOS/RHEL — descomentar em /etc/httpd/conf/httpd.conf:
LoadModule rewrite_module modules/mod_rewrite.so
Permitir sobrescritas do .htaccess
<Directory /var/www/html>
AllowOverride All
</Directory>
Diretiva Redirect
A abordagem mais simples — não requer regex:
# 301 permanente
Redirect 301 /old-page.html https://example.com/new-page.html
# 302 temporário
Redirect 302 /sale https://example.com/promo
# Redirecionamento de todo o site para um novo domínio
Redirect 301 / https://new-domain.com/
💡 Limitações do Redirect
A diretiva Redirect é simples, mas não suporta regex nem lógica condicional. Use RewriteRule para qualquer coisa mais complexa.
RewriteRule
RewriteEngine On
# HTTP → HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# sem www → www
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Flags comuns
[R=301]— redirecionamento 301 permanente[R=302]— redirecionamento 302 temporário[L]— última regra, parar o processamento[NC]— correspondência sem distinção de maiúsculas[QSA]— anexar a query string original
RewriteCond
Condições que devem ser verdadeiras antes que a próxima RewriteRule seja executada:
# Redirecionar usuários mobile
RewriteCond %{HTTP_USER_AGENT} "android|iphone|ipad" [NC]
RewriteRule ^(.*)$ https://m.example.com/$1 [R=302,L]
# Redirecionar com base na query string
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^article$ /post/%1? [R=301,L]
Cenários comuns
Forçar HTTPS + www
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
Remover extensão .html
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.+)$ $1.html [L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(.+)\.html
RewriteRule ^ /%1 [R=301,L]
Permalinks do WordPress
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
Erros comuns
Erro 500 Internal Server Error
Quase sempre é um erro de sintaxe no .htaccess. Verifique o log de erros do Apache:
tail -f /var/log/apache2/error.log
Loop de redirecionamento
# ❌ Loop — não há condição para parar a correspondência
RewriteRule ^(.*)$ https://example.com/ [R=301,L]
# ✅ Adicionar condição HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/ [R=301,L]
Perda de query strings
# ❌ Query string perdida
RewriteRule ^old-page$ /new-page [R=301,L]
# ✅ Preservar com o flag QSA
RewriteRule ^old-page$ /new-page [R=301,L,QSA]
Depuração
# Habilitar log de rewrite (Apache 2.4)
LogLevel alert rewrite:trace3
# Testar com curl
curl -I http://example.com/old-page
curl -IL http://example.com/old-page
Ou use o 301check.com para visualizar a cadeia completa de redirecionamento.