Envoi de formulaire HTML7 min de lecture
Rediriger vers une page de remerciement après l'envoi d'un formulaire
Envoyez les visiteurs vers votre propre page de remerciement après l'envoi d'un formulaire : la redirection 303, le champ _redirect, les domaines autorisés et l'effet d'un rafraîchissement.
Un formulaire ne peut pas se rediriger lui-même ; le serveur qui reçoit l'envoi répond 303 See Other avec un en-tête Location, et le navigateur charge cette page. Avec Ikiform, définissez Redirect after submit dans les paramètres du formulaire, ou ajoutez un input masqué _redirect avec une URL https: sur l'un des Allowed domains du formulaire. Sans l'un ni l'autre, les visiteurs arrivent sur la page de remerciement hébergée par Ikiform.
L'exemple est un formulaire de demande de démo dont la page de remerciement est en réalité une étape suivante : elle demande au visiteur de choisir un créneau. La cible de la redirection compte donc plus que d'habitude, et cela soulève la question dont traite surtout cette page : qui a le droit de décider où un formulaire envoie les gens.
Ce qui change ici
Le HTML n'a pas d'attribut pour « aller ici après l'envoi ». L'action est l'endroit où vont les données, et la page suivante est ce que le serveur répond. La redirection est donc toujours la décision du serveur qui reçoit. Quand ce serveur est Ikiform, il y a exactement deux façons de l'influencer, et elles n'inspirent pas la même confiance.
| Item | Paramètre Redirect after submit | Input masqué _redirect |
|---|---|---|
| Qui le définit | Les membres de votre espace de travail, dans le tableau de bord | Toute personne qui peut modifier le HTML de la page, ou le navigateur du visiteur |
| Cibles autorisées | Toute URL http: ou https: | https: uniquement, sur un domaine autorisé ou l'un de ses sous-domaines |
| Portée | Une seule cible pour tout le formulaire | Une par page, donc par langue ou par campagne |
| Quand les deux sont définis | Prioritaire | Ignoré |
Les règles strictes sur _redirect existent parce que sa valeur arrive avec l'envoi. Sans elles, n'importe qui pourrait placer l'URL de votre formulaire dans un lien qui envoie puis renvoie les visiteurs vers une page de phishing : c'est ce qu'on appelle une redirection ouverte.
- Si le formulaire a une URL Redirect after submit dans ses paramètres, Ikiform répond par un 303 vers celle-ci sans chercher plus loin.
- Sinon, si l'envoi a un champ _redirect, ou _next, qui est une URL https sur un domaine autorisé sans port ni identifiants, Ikiform y redirige.
- Sinon, Ikiform redirige vers sa page de remerciement hébergée, qui renvoie un lien vers votre page quand l'envoi vient d'une page https sur un domaine autorisé.
Le formulaire
<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>Ajoutez example.com sous les Allowed domains du formulaire et ce formulaire s'envoie, reçoit un 303 et arrive sur /demo/next-step. La page de remerciement est du HTML ordinaire sur votre 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>noindexla garde hors des résultats de recherche. Personne ne devrait y arriver depuis Google, et une page de remerciement qui apparaît comme page d'entrée dans vos statistiques signale qu'un lien y mène.- Le rafraîchissement est sans risque. Comme Ikiform a répondu par
303, le navigateur a chargé cette page en GET, et la recharger ne renvoie rien. - Si vous comptez les conversions sur cette page, comptez une fois par session. Un rafraîchissement ou un favori la recharge, et le tableau de bord d'Ikiform fait foi pour le décompte.
Rediriger vers un autre site
Supposons que vous vouliez sauter votre propre page et envoyer directement les gens vers un outil de réservation sur un autre domaine, comme cal.example.com ou le domaine d'un service de prise de rendez-vous. Avec _redirect, ce domaine devrait figurer dans Allowed domains, et cette liste a un second rôle : elle décide quels sites peuvent envoyer vers le formulaire. Ajouter le domaine d'un service de prise de rendez-vous signifie que des pages de ce domaine pourraient aussi envoyer vers votre formulaire.
Utilisez plutôt Redirect after submit dans les paramètres du formulaire. Il accepte n'importe quelle URL, car seul votre espace de travail peut le définir, et il laisse Allowed domains ne lister que vos propres sites.
Des pages différentes pour des formulaires différents
Le paramètre du tableau de bord correspond à une URL par formulaire. Quand un même formulaire apparaît sur plusieurs pages qui ont besoin de pages de remerciement différentes, laissez le paramètre vide et donnez à chaque page son propre _redirect. Une page en allemand envoie les visiteurs vers la page de remerciement en allemand :
<input type="hidden" name="_redirect" value="https://example.com/de/demo/danke" />Ajouter une valeur à la redirection
Les paramètres d'URL de _redirect sont conservés, donc vous pouvez transmettre à la page de remerciement ce que le visiteur a choisi. Définissez la valeur dans un écouteur submit, qui s'exécute après la validation du navigateur et avant l'encodage du formulaire :
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;
});Le visiteur arrive sur /demo/next-step?size=11-50, et la page peut afficher le bon lien de réservation pour cette taille d'équipe. Limitez-vous à des valeurs non personnelles : les paramètres d'URL finissent dans l'historique du navigateur, les journaux du serveur et les outils d'analyse.
Rediriger après un envoi avec fetch
Un appel fetch reçoit du JSON, pas une redirection, donc les règles de redirection d'Ikiform ne s'appliquent pas. Naviguez vous-même quand la réponse est 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");Utilisez location.assign plutôt que location.replace si le bouton retour doit ramener au formulaire. Le guide sans rechargement contient le gestionnaire complet avec erreurs et état de chargement.
Vérifiez que tout fonctionne
- Dans Allowed domains du formulaire, ajoutez le domaine de votre site, plus
localhostpendant le développement. Laissez vide pour accepter les envois de partout. - Envoyez le formulaire depuis votre page en production. La barre d'adresse affiche votre page de remerciement, et le panneau Réseau montre que l'envoi a reçu
303. - Rafraîchissez la page de remerciement. Le navigateur ne demande pas de renvoyer le formulaire, et le tableau de bord affiche toujours une seule soumission.
- Remplacez
_redirectpar une adresse sur un domaine non autorisé et envoyez. Vous arrivez plutôt sur la page de remerciement hébergée par Ikiform, sans erreur. - Ouvrez Submissions dans le tableau de bord. La nouvelle soumission y est, avec tous les champs envoyés.
Pièges
| Problème | Cause et solution |
|---|---|
_redirect est ignoré alors que le domaine est autorisé | Redirect after submit est défini dans les paramètres du formulaire, et il l'emporte toujours. Videz-le pour utiliser des redirections par page |
Fonctionne en production, pas sur localhost | _redirect doit être en https: sans port, donc http://localhost:3000/thanks ne passe jamais. Testez sur un déploiement de preview, ou acceptez la page hébergée en local |
| La page de remerciement hébergée n'a pas de lien vers votre site | Elle ne renvoie un lien que lorsque l'envoi vient d'une page https: sur l'un des domaines autorisés du formulaire. Ajoutez le domaine, ou redirigez vers votre propre page |
| Le navigateur arrive sur la page de remerciement d'Ikiform au lieu de la vôtre | _redirect est ignoré sauf si son domaine figure dans Allowed domains et qu'il s'agit d'une URL https:. Ajoutez le domaine, ou définissez plutôt Redirect after submit dans les réglages du formulaire. |
| La page de remerciement apparaît dans les résultats de recherche | Ajoutez-y <meta name="robots" content="noindex">, et ne la liez pas depuis votre navigation |
Les règles exactes, avec des exemples d'URL acceptées et refusées, se trouvent dans Formulaires HTML. La vue d'ensemble explique pourquoi la réponse est un 303 et pas un 302 ou un 200.
Questions
Le serveur qui reçoit le formulaire répond par une redirection 303 vers la page. Avec Ikiform, définissez Redirect after submit dans les paramètres du formulaire, ou ajoutez un input masqué _redirect avec une URL https sur l'un des domaines autorisés du formulaire.
Soit le paramètre Redirect after submit du formulaire est défini, et il l'emporte toujours, soit l'URL ne respecte pas les règles : elle doit être en https, sur un domaine autorisé ou l'un de ses sous-domaines, sans port, nom d'utilisateur ni mot de passe. Les formulaires sans domaines autorisés ignorent _redirect.
Oui. Placez l'URL dans le paramètre Redirect after submit du formulaire, qui accepte toute URL http ou https. Utiliser _redirect à la place obligerait à ajouter ce site à vos domaines autorisés, ce qui lui permettrait aussi d'envoyer vers votre formulaire.
Pas via la redirection d'Ikiform, qui utilise l'URL exactement telle qu'elle est donnée. Vous pouvez ajouter des valeurs non personnelles à l'URL _redirect dans un écouteur submit, ou afficher un message depuis votre propre script après un envoi avec fetch.
Une étape vous bloque, ou vous voulez un guide pour votre cas ? Écrivez à hello@ikiform.com.