Gere regras de redirecionamento .htaccess 301 e 302
Transforme uma lista de redirecionamentos em regras Apache prontas para colar, sem escrever expressões regulares manualmente.
Executar grátis
Informe cada caminho antigo e seu destino, escolha uma resposta permanente 301 ou temporária 302 e receba linhas RewriteRule exatas, além de um bloco .htaccess completo. O gerador protege os caminhos de origem, aceita destinos locais e URLs HTTP ou HTTPS absolutas, mantém a ordem informada e sinaliza pares incompletos antes que eles causem redirecionamentos quebrados.
Prepare uma lista de redirecionamentos clara
Comece com uma linha para cada endereço que precisa mudar. A ferramenta para gerar regras de redirecionamento .htaccess espera um caminho de origem no campo from e um destino no campo to. A origem deve ser um caminho relativo à raiz iniciado por barra, como /produtos-antigos/widget. Não inclua query strings nem fragmentos na origem, pois o RewriteRule do Apache compara o caminho da URL, não esses componentes. O destino pode ser outro caminho relativo à raiz do mesmo site ou uma URL HTTP ou HTTPS completa quando o visitante deve seguir para outro host. Use caracteres codificados por porcentagem quando a URL precisar deles, em vez de espaços literais. Mantenha as linhas na ordem em que o Apache deve avaliá-las. Embora as regras geradas façam correspondência com caminhos completos e evitem muitos conflitos, uma ordem planejada facilita revisar, manter e comparar a configuração com uma planilha de migração. Cada linha é validada; se from ou to estiver ausente, a geração para e informa qual par está incompleto.
Escolha um comportamento permanente ou temporário
Selecione 301 quando a mudança for permanente e mecanismos de busca, navegadores e sistemas posteriores precisarem aprender o endereço substituto. Selecione 302 quando a alteração for temporária, por exemplo durante uma campanha curta, uma janela de manutenção ou um teste controlado. O status escolhido vale para todos os pares de uma solicitação, evitando que uma planilha mista produza silenciosamente um comportamento diferente do esperado. Cada linha de saída usa um padrão de origem ancorado, um destino validado e as flags do Apache R=301,L ou R=302,L. As âncoras tornam a origem uma correspondência exata de caminho, em vez de uma substring ampla, enquanto L encerra a passagem de reescrita atual depois que a regra é aplicada. O gerador também escapa pontuação de expressão regular na origem, para que um ponto ou parênteses literais não correspondam acidentalmente a outros endereços. Confirme se o servidor lê arquivos .htaccess e se mod_rewrite está habilitado; a ferramenta cria diretivas, mas não inspeciona nem altera a instalação do Apache.
Instale e verifique o bloco gerado
Copie o valor htaccess para o arquivo .htaccess adequado no escopo do site que trata os caminhos de origem. O resultado contém somente linhas RewriteRule; portanto, uma configuração existente talvez já tenha RewriteEngine On. Adicione essa diretiva separadamente se o arquivo ainda não ativar a reescrita. Faça backup da configuração atual antes de editar e teste em homologação sempre que possível. Acesse cada URL antiga e confirme o status da resposta, o cabeçalho Location, a página final e a ausência de uma cadeia inesperada de redirecionamentos. Teste também uma URL semelhante que não deveria redirecionar, pois verificações negativas revelam interações que um teste bem-sucedido do destino não mostra. Regras locais do Apache podem ser afetadas por diretivas acima ou abaixo do bloco, configurações de host virtual, camadas de proxy e reescritas do sistema de gerenciamento de conteúdo. Para automação, a API retorna um array de regras individuais e um bloco unido por quebras de linha. Cada solicitação custa US$ 0,002; o mesmo gerador determinístico também funciona no navegador para migrações pontuais.
Casos de uso
Publique um site reformulado
Converta o mapa aprovado de caminhos antigos e novos em diretivas permanentes exatas antes de colocar a nova arquitetura no ar.
Execute uma campanha temporária
Crie regras 302 consistentes para mudanças breves de landing pages que não devem ser tratadas como substituições permanentes.
Mova páginas específicas para outro domínio
Gere regras com destinos HTTPS absolutos e mantenha cada caminho de origem explícito e fácil de revisar.
Perguntas frequentes
Quanto custa?
Uma solicitação de API custa US$ 0,002. Você também pode executar o gerador no navegador nesta página.
A saída inclui RewriteEngine On?
Não. A saída contém apenas linhas RewriteRule porque muitos arquivos .htaccess existentes já habilitam o mecanismo de reescrita.
Uma solicitação pode misturar redirecionamentos 301 e 302?
Não. O tipo escolhido vale para todos os pares da solicitação. Use solicitações separadas quando precisar distinguir regras permanentes e temporárias.
O destino pode apontar para outro domínio?
Sim. O destino pode ser uma URL HTTP ou HTTPS absoluta sem credenciais incorporadas ou um caminho relativo à raiz do site atual.
O que acontece quando um par está incompleto?
A geração para com um erro de entrada inválida que identifica o par e informa se o campo from ou to está ausente.
Query strings são aceitas nos caminhos de origem?
Não. RewriteRule compara caminhos, não query strings; essa comparação exige diretivas RewriteCond adicionais fora deste gerador.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/web/htaccess-redirect-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}'const res = await fetch("https://api.kit.forhosting.com/web/htaccess-redirect-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/htaccess-redirect-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/htaccess-redirect-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pairs":[{"from":"/old-page","to":"/new-page"},{"from":"/docs/v1/","to":"https://docs.example.com/v2/"}],"redirect_type":301}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/htaccess-redirect-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"pairs": [
{
"from": "/old-page",
"to": "/new-page"
},
{
"from": "/docs/v1/",
"to": "https://docs.example.com/v2/"
}
],
"redirect_type": 301
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.htaccess_redirect_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_items | 500 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |