Envio de formulários HTML7 min de leitura
Redirecionar para uma página de agradecimento após enviar o formulário
Mande visitantes para sua própria página de agradecimento depois do envio: o redirecionamento 303, o campo _redirect, quais domínios são permitidos e o que o refresh faz.
Um formulário não consegue se redirecionar sozinho; o servidor que recebe o envio responde 303 See Other com um header Location, e o navegador carrega essa página. Com o Ikiform, defina Redirect after submit (redirecionar após o envio) nas configurações do formulário, ou adicione um input oculto _redirect com uma URL https: em um dos Allowed domains do formulário. Sem nenhum dos dois, os visitantes chegam à página de agradecimento hospedada do Ikiform.
O exemplo é um formulário de pedido de demo cuja página de agradecimento é na verdade um próximo passo: ela pede ao visitante para escolher um horário. Isso torna o destino do redirecionamento mais importante que o normal, e levanta a pergunta de que esta página mais trata: quem pode decidir para onde um formulário manda as pessoas.
O que muda aqui
O HTML não tem atributo para "vá para cá depois de enviar". O action é para onde os dados vão, e a página seguinte é o que o servidor responder. Então o redirecionamento é sempre decisão do servidor que recebe. Quando esse servidor é o Ikiform, há exatamente duas formas de influenciá-lo, e elas não têm o mesmo nível de confiança.
| Item | Configuração Redirect after submit | Input oculto _redirect |
|---|---|---|
| Quem define | Membros do seu workspace, no painel | Qualquer pessoa que possa editar o HTML da página, ou o navegador do visitante |
| Destinos permitidos | Qualquer URL http: ou https: | Só https:, num domínio permitido ou num subdomínio de um deles |
| Escopo | Um destino para o formulário inteiro | Um por página, então por idioma ou por campanha |
| Quando os dois estão definidos | Prevalece | Ignorado |
As regras rígidas do _redirect existem porque o valor dele chega junto com o envio. Sem elas, qualquer um poderia colocar a URL do seu formulário num link que envia e depois joga os visitantes numa página de phishing, que é o que é um open redirect.
- Se o formulário tem uma URL de Redirect after submit nas configurações, o Ikiform responde com um 303 para ela e não procura mais nada.
- Caso contrário, se o envio tem um campo _redirect, ou _next, que é uma URL https num domínio permitido sem porta nem credenciais, o Ikiform redireciona para lá.
- Caso contrário, o Ikiform redireciona para a página de agradecimento hospedada, que tem um link de volta para a sua página quando o envio veio de uma página https num domínio permitido.
O formulário
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
<label for="email">Work email</label>
<input id="email" name="email" type="email" autocomplete="email" required />
<label for="company">Company</label>
<input id="company" name="company" autocomplete="organization" required />
<label for="team_size">Team size</label>
<select id="team_size" name="team_size">
<option value="1-10">1 to 10</option>
<option value="11-50">11 to 50</option>
<option value="51+">51 or more</option>
</select>
<input type="hidden" name="_redirect" value="https://example.com/demo/next-step" />
<input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
<button>Request a demo</button>
</form>Adicione example.com em Allowed domains do formulário e isto envia, recebe um 303 e chega a /demo/next-step. A página de agradecimento é HTML comum no seu site:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex" />
<title>Thanks, pick a time</title>
</head>
<body>
<h1>Thanks. One more step.</h1>
<p>Pick a time for your demo. You'll get a calendar invite right away.</p>
<p><a href="https://cal.example.com/acme/demo">Choose a time</a></p>
</body>
</html>noindexa mantém fora dos resultados de busca. Ninguém deveria chegar lá pelo Google, e uma página de agradecimento aparecendo como página de entrada nos seus analytics é sinal de que algo aponta para ela.- O refresh é seguro. Como o Ikiform respondeu com
303, o navegador carregou esta página com GET, e recarregá-la não envia nada de novo. - Se você conta conversões nesta página, conte uma vez por sessão. Um refresh ou um favorito a recarrega, e a contagem real é a do painel do Ikiform.
Redirecionar para outro site
Suponha que você queira pular sua própria página e mandar as pessoas direto para uma ferramenta de agendamento em outro domínio, como cal.example.com ou o domínio de um serviço de agendamento. Com _redirect, esse domínio teria que estar em Allowed domains, e essa lista tem uma segunda função: ela decide quais sites podem enviar ao formulário. Adicionar o domínio de um serviço de agendamento significa que páginas nesse domínio também poderiam enviar ao seu formulário.
Use Redirect after submit nas configurações do formulário. Ele aceita qualquer URL, porque só o seu workspace pode defini-lo, e deixa Allowed domains listando só os seus próprios sites.
Páginas diferentes para formulários diferentes
A configuração do painel é uma URL por formulário. Quando um formulário aparece em várias páginas que precisam de páginas de agradecimento diferentes, deixe a configuração vazia e dê a cada página seu próprio _redirect. Uma página em alemão manda os visitantes para a página de agradecimento em alemão:
<input type="hidden" name="_redirect" value="https://example.com/de/demo/danke" />Acrescentando um valor ao redirecionamento
Query strings no _redirect são mantidas, então você pode passar o que o visitante escolheu para a página de agradecimento. Defina o valor num listener de submit, que roda depois da validação do navegador e antes de o formulário ser codificado:
const form = document.querySelector("form");
const redirect = form.elements.namedItem("_redirect");
form.addEventListener("submit", () => {
const size = form.elements.namedItem("team_size").value;
const next = new URL("https://example.com/demo/next-step");
next.searchParams.set("size", size);
redirect.value = next.href;
});O visitante chega em /demo/next-step?size=11-50, e a página pode mostrar o link de agendamento certo para aquele tamanho de equipe. Use só valores não pessoais: query strings acabam no histórico do navegador, em logs de servidor e nos analytics.
Redirecionar depois de um envio por fetch
Uma chamada fetch recebe JSON, não um redirecionamento, então as regras de redirecionamento do Ikiform não se aplicam. Navegue você mesmo quando a resposta for ok:
const response = await fetch(form.action, {
method: "POST",
headers: { Accept: "application/json" },
body: new FormData(form),
});
const result = await response.json();
if (result.ok) location.assign("/demo/next-step");Use location.assign em vez de location.replace se o botão voltar deve retornar ao formulário. O guia sem recarregar tem o handler completo com erros e estado de carregamento.
Confira se funciona
- Em Allowed domains do formulário, adicione o domínio do seu site, mais
localhostenquanto desenvolve. Deixe vazio para aceitar envios de qualquer lugar. - Envie o formulário pela sua página no ar. A barra de endereço mostra sua página de agradecimento, e o painel Network mostra o envio respondido com
303. - Aperte refresh na página de agradecimento. O navegador não pede para reenviar, e o painel continua mostrando um envio.
- Troque o
_redirectpor um endereço num domínio que não é permitido e envie. Você chega à página de agradecimento hospedada do Ikiform, sem erro. - Abra Submissions no painel. O novo envio está lá com todos os campos que você enviou.
Pegadinhas
| Problema | Causa e solução |
|---|---|
_redirect é ignorado mesmo com o domínio permitido | Redirect after submit está definido nas configurações do formulário, e ele sempre prevalece. Limpe-o para usar redirecionamentos por página |
Funciona em produção, não em localhost | _redirect precisa ser https: sem porta, então http://localhost:3000/thanks nunca passa. Teste num deploy de preview, ou aceite a página hospedada localmente |
| A página de agradecimento hospedada não tem link de volta para o seu site | Ela só tem o link de volta quando o envio veio de uma página https: em um dos domínios permitidos do formulário. Adicione o domínio, ou redirecione para sua própria página |
| O navegador cai na página de agradecimento do Ikiform em vez da sua | O _redirect é ignorado, a menos que o domínio dele esteja em Allowed domains e ele seja uma URL https:. Adicione o domínio, ou defina Redirect after submit nas configurações do formulário. |
| A página de agradecimento aparece nos resultados de busca | Adicione <meta name="robots" content="noindex"> a ela, e não coloque link para ela na sua navegação |
As regras exatas, com exemplos de URLs que passam e que falham, estão em Formulários HTML. A visão geral explica por que a resposta é um 303 e não um 302 ou 200.
Perguntas
O servidor que recebe o formulário responde com um redirecionamento 303 para a página. Com o Ikiform, defina Redirect after submit nas configurações do formulário, ou adicione um input oculto _redirect com uma URL https em um dos domínios permitidos do formulário.
Ou a configuração Redirect after submit do formulário está definida, e ela sempre prevalece, ou a URL não passa nas regras: precisa ser https, num domínio permitido ou num subdomínio de um deles, sem porta, usuário ou senha. Formulários sem domínios permitidos ignoram _redirect.
Sim. Coloque a URL na configuração Redirect after submit do formulário, que aceita qualquer URL http ou https. Usar _redirect exigiria adicionar esse site aos seus domínios permitidos, o que também o deixa enviar ao seu formulário.
Não pelo redirecionamento do Ikiform, que usa a URL exatamente como informada. Você pode acrescentar valores não pessoais à URL de _redirect num listener de submit, ou mostrar uma mensagem pelo seu próprio script depois de um envio por fetch.
Travou em algum passo ou quer um guia para o seu caso? Envie um e-mail para hello@ikiform.com.