# Redirigir a una página de agradecimiento tras enviar un formulario

> Manda a los visitantes a tu propia página de agradecimiento cuando se envía un formulario: la redirección 303, el campo _redirect, qué dominios se permiten y qué pasa al recargar.

Publicado el 2026-10-25 · https://ikiform.com/es/guides/html-form-submission/redirect-after-submit

Un formulario no puede redirigirse a sí mismo; el servidor que recibe el envío responde `303 See Other` con una cabecera `Location`, y el navegador carga esa página. Con Ikiform, configura **Redirect after submit** en los ajustes del formulario, o añade un input oculto `_redirect` con una URL `https:` en uno de los **Allowed domains** del formulario. Sin ninguno de los dos, los visitantes llegan a la página de agradecimiento alojada de Ikiform.

El ejemplo es un formulario de solicitud de demo cuya página de agradecimiento es en realidad un siguiente paso: pide al visitante que elija una hora. Eso hace que el destino de la redirección importe más de lo normal, y plantea la pregunta de la que trata sobre todo esta página: quién puede decidir adónde manda a la gente un formulario.

## Qué cambia aquí

HTML no tiene ningún atributo para "ir aquí después de enviar". El `action` es adonde van los datos, y la página siguiente es lo que responda el servidor. Así que la redirección siempre la decide el servidor que recibe el envío. Cuando ese servidor es Ikiform, hay exactamente dos formas de influir en ella, y no tienen la misma confianza.

|   | Ajuste Redirect after submit | Input oculto `_redirect` |
| --- | --- | --- |
| Quién lo configura | Los miembros de tu espacio de trabajo, en el panel | Cualquiera que pueda editar el HTML de la página, o el navegador del visitante |
| Destinos permitidos | Cualquier URL `http:` o `https:` | Solo `https:`, en un dominio permitido o en un subdominio de uno |
| Alcance | Un destino para todo el formulario | Uno por página, así que por idioma o por campaña |
| Cuando están los dos | Gana | Se ignora |

Las reglas estrictas de `_redirect` existen porque su valor llega con el envío. Sin ellas, cualquiera podría poner la URL de tu formulario en un enlace que envía y luego redirige a los visitantes a una página de phishing, que es lo que es una redirección abierta.

Diagrama: Cómo elige Ikiform adónde mandar al navegador tras un envío correcto

1. Si el formulario tiene una URL de Redirect after submit en sus ajustes, Ikiform responde con un 303 hacia ella y no mira más.
2. Si no, si el envío tiene un campo _redirect, o _next, que es una URL https en un dominio permitido sin puerto ni credenciales, Ikiform redirige ahí.
3. Si no, Ikiform redirige a su página de agradecimiento alojada, que enlaza de vuelta a tu página cuando el envío vino de una página https en un dominio permitido.

Gana la primera coincidencia. Un _redirect que no cumple las reglas pasa al siguiente sin avisar; nunca es un error.

## El formulario

`demo.html`:

```html
<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>
```

Añade `example.com` en los **Allowed domains** del formulario y esto envía, recibe un `303` y llega a `/demo/next-step`. La página de agradecimiento es HTML normal en tu sitio:

`demo/next-step.html`:

```html
<!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>
```

- `noindex` la mantiene fuera de los resultados de búsqueda. Nadie debería llegar ahí desde Google, y una página de agradecimiento como entrada en tus analíticas es señal de que algo enlaza a ella.
- Recargar es seguro. Como Ikiform respondió con `303`, el navegador cargó esta página con GET, y recargarla no vuelve a enviar nada.
- Si cuentas conversiones en esta página, cuenta una vez por sesión. Una recarga o un marcador la vuelven a cargar, y el panel de Ikiform es el recuento real.

## Redirigir a otro sitio

Supón que quieres saltarte tu propia página y mandar a la gente directamente a una herramienta de reservas en otro dominio, como `cal.example.com` o el dominio de un servicio de agenda. Con `_redirect`, ese dominio tendría que estar en **Allowed domains**, y esa lista tiene un segundo trabajo: decide qué sitios pueden enviar al formulario. Añadir el dominio de un servicio de agenda significa que las páginas de ese dominio también podrían enviar a tu formulario.

Usa en su lugar **Redirect after submit** en los ajustes del formulario. Acepta cualquier URL, porque solo tu espacio de trabajo puede configurarlo, y deja **Allowed domains** con solo tus propios sitios.

> Ikiform redirige a la URL exactamente como se indica. No añade el id del envío ni ningún valor de campo, así que una página de reservas no se puede rellenar desde la redirección. Vuelve a pedir el email allí, o enlaza a la página de reservas desde tu propia página de agradecimiento.

## Páginas distintas para formularios distintos

El ajuste del panel es una URL por formulario. Cuando un formulario aparece en varias páginas que necesitan páginas de agradecimiento distintas, deja el ajuste vacío y dale a cada página su propio `_redirect`. Una página en alemán manda a los visitantes a la página de agradecimiento en alemán:

`de/demo.html`:

```html
<input type="hidden" name="_redirect" value="https://example.com/de/demo/danke" />
```

### Añadir un valor a la redirección

Las query strings de `_redirect` se conservan, así que puedes pasar a la página de agradecimiento lo que eligió el visitante. Pon el valor en un listener de submit, que se ejecuta después de la validación del navegador y antes de que se codifique el formulario:

`demo.js`:

```js
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;
});
```

El visitante llega a `/demo/next-step?size=11-50`, y la página puede mostrar el enlace de reserva adecuado para ese tamaño de equipo. Limítalo a valores no personales: las query strings acaban en el historial del navegador, los logs del servidor y las analíticas.

## Redirigir tras un envío con fetch

Una llamada `fetch` recibe JSON, no una redirección, así que las reglas de redirección de Ikiform no se aplican. Navega tú cuando la respuesta sea `ok`:

`Redirigir desde un script`:

```js
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");
```

Usa `location.assign` en lugar de `location.replace` si el botón atrás debe volver al formulario. La [guía sin recarga](https://ikiform.com/es/guides/html-form-submission/without-page-reload.md) tiene el manejador completo con errores y estado de carga.

## Comprueba que funciona

1. En **Allowed domains** del formulario, añade el dominio de tu sitio, y `localhost` mientras desarrollas. Déjalo vacío para aceptar envíos desde cualquier lugar.
2. Envía el formulario desde tu página publicada. La barra de direcciones muestra tu página de agradecimiento, y el panel Network muestra el envío respondido con `303`.
3. Pulsa recargar en la página de agradecimiento. El navegador no pide reenviar, y el panel sigue mostrando un envío.
4. Cambia `_redirect` a una dirección en un dominio no permitido y envía. Llegas en su lugar a la página de agradecimiento alojada de Ikiform, sin ningún error.
5. Abre **Submissions** en el panel. El nuevo envío está ahí con todos los campos que enviaste.

## Errores comunes

| Problema | Causa y solución |
| --- | --- |
| Se ignora `_redirect` aunque el dominio está permitido | **Redirect after submit** está configurado en los ajustes del formulario, y siempre gana. Vacíalo para usar redirecciones por página |
| Funciona en producción, no en `localhost` | `_redirect` debe ser `https:` sin puerto, así que `http://localhost:3000/thanks` nunca pasa. Prueba en un despliegue de vista previa, o acepta la página alojada en local |
| La página de agradecimiento alojada no tiene enlace de vuelta a tu sitio | Solo enlaza de vuelta cuando el envío vino de una página `https:` en uno de los dominios permitidos del formulario. Añade el dominio, o redirige a tu propia página |
| El navegador acaba en la página de agradecimiento de Ikiform en lugar de la tuya | `_redirect` se ignora salvo que su dominio esté en **Allowed domains** y sea una URL `https:`. Añade el dominio, o configura **Redirect after submit** en los ajustes del formulario. |
| La página de agradecimiento aparece en los resultados de búsqueda | Añádele `<meta name="robots" content="noindex">` y no la enlaces desde tu navegación |

Las reglas exactas, con ejemplos de URLs que pasan y que fallan, están en [Formularios HTML](https://ikiform.com/es/docs/html.md#redirect-rules). El [resumen](https://ikiform.com/es/guides/html-form-submission.md#response) explica por qué la respuesta es un `303` y no un `302` o un `200`.

## Preguntas

### ¿Cómo redirijo a otra página después de enviar un formulario HTML?

El servidor que recibe el formulario responde con una redirección 303 a la página. Con Ikiform, configura Redirect after submit en los ajustes del formulario, o añade un input oculto _redirect con una URL https en uno de los dominios permitidos del formulario.

### ¿Por qué se ignora mi _redirect?

O bien está configurado el ajuste Redirect after submit del formulario, que siempre gana, o la URL no cumple las reglas: debe ser https, en un dominio permitido o en un subdominio de uno, sin puerto, usuario ni contraseña. Los formularios sin dominios permitidos ignoran _redirect.

### ¿Puedo redirigir a otro sitio web después de enviar el formulario?

Sí. Pon la URL en el ajuste Redirect after submit del formulario, que acepta cualquier URL http o https. Usar _redirect en su lugar implicaría añadir ese sitio a tus dominios permitidos, lo que también le permite enviar a tu formulario.

### ¿Puede la página de agradecimiento mostrar lo que envió el visitante?

No desde la redirección de Ikiform, que usa la URL exactamente como se indica. Puedes añadir valores no personales a la URL de _redirect en un listener de submit, o mostrar un mensaje desde tu propio script tras un envío con fetch.

## Más guías

- [Envío de formularios HTML](https://ikiform.com/es/guides/html-form-submission.md): Qué hace un navegador cuando se envía un formulario: qué campos envía, cómo los codifica, qué debería responder el servidor y cómo responde Ikiform.
- [Sin recargar la página](https://ikiform.com/es/guides/html-form-submission/without-page-reload.md): Envía un formulario con fetch y FormData para que el visitante se quede en la página, con errores de campo, estado de carga, reintentos y un plan B cuando los scripts fallan.
- [El atributo action](https://ikiform.com/es/guides/html-form-submission/action-attribute.md): Qué hace el atributo action de un formulario, cómo se resuelven los valores relativos y vacíos, cómo formaction envía un formulario a dos sitios y por qué los hostings estáticos responden 405.
- [Validación de formularios](https://ikiform.com/es/guides/html-form-submission/validation.md): Valida un formulario con required, type, pattern y min, da estilo a los errores con :user-invalid y aplica las mismas reglas en el servidor con definiciones de campos.
