Pengiriman formulir HTML

Pengiriman formulir HTML6 menit baca

Redirect ke halaman terima kasih setelah submit formulir

Arahkan pengunjung ke halaman terima kasih Anda sendiri setelah formulir terkirim: redirect 303, field _redirect, domain mana yang diizinkan, dan apa efek refresh.

Preet SutharPendiri, Ikiform

Formulir tidak bisa me-redirect dirinya sendiri; server yang menerima post menjawab 303 See Other dengan header Location, dan browser memuat halaman itu. Dengan Ikiform, atur Redirect after submit di pengaturan formulir, atau tambahkan input _redirect tersembunyi dengan URL https: di salah satu Allowed domains formulir. Tanpa keduanya, pengunjung mendarat di halaman terima kasih hosted milik Ikiform.

Contohnya adalah formulir permintaan demo yang halaman terima kasihnya sebenarnya langkah berikutnya: halaman itu meminta pengunjung memilih waktu. Itu membuat tujuan redirect lebih penting dari biasanya, dan memunculkan pertanyaan yang menjadi inti halaman ini: siapa yang boleh menentukan ke mana formulir mengirim orang.

Apa yang berbeda di sini

HTML tidak punya atribut untuk "pergi ke sini setelah submit". action adalah tujuan data, dan halaman sesudahnya adalah apa pun yang dijawab server. Jadi redirect selalu menjadi keputusan server penerima. Saat server itu adalah Ikiform, ada tepat dua cara untuk memengaruhinya, dan tingkat kepercayaannya tidak sama.

ItemPengaturan Redirect after submitInput tersembunyi _redirect
Siapa yang mengaturnyaAnggota workspace Anda, di dashboardSiapa pun yang bisa mengedit HTML halaman, atau browser pengunjung
Tujuan yang diizinkanURL http: atau https: apa punHanya https:, di domain yang diizinkan atau subdomainnya
CakupanSatu tujuan untuk seluruh formulirSatu per halaman, jadi per bahasa atau per kampanye
Saat keduanya diaturMenangDiabaikan

Aturan ketat pada _redirect ada karena nilainya datang bersama post. Tanpa aturan itu, siapa pun bisa menaruh URL formulir Anda di tautan yang mengirim lalu melempar pengunjung ke halaman phishing, itulah yang disebut open redirect.

Bagaimana Ikiform memilih ke mana browser dikirim setelah post berhasil1. Redirect after submit diatur2. _redirect lolos aturan3. tidak keduanyapost berhasilpengaturandashboardURL http: atau https:apa pun303 ke sanapost berhasil_redirect atau_nexthttps:, domaindiizinkan, tanpa port303 ke sanapost berhasilterima kasihhosted/f/<formId>/thanks303 ke sanamenautkan kembali kehalaman AndaBagaimana Ikiform memilih ke mana browser dikirim setelah post berhasil1. Redirect after submit diatur2. _redirect lolos aturan3. tidak keduanyapost berhasilpengaturan dashboardURL http: atau https: apa pun303 ke sanapost berhasil_redirect atau _nexthttps:, domain diizinkan, tanpaport303 ke sanapost berhasilterima kasih hosted/f/<formId>/thanks303 ke sanamenautkan kembali ke halamanAnda
  1. Jika formulir punya URL Redirect after submit di pengaturannya, Ikiform menjawab dengan 303 ke sana dan tidak mencari lagi.
  2. Jika tidak, dan post punya field _redirect, atau _next, berupa URL https di domain yang diizinkan tanpa port atau kredensial, Ikiform me-redirect ke sana.
  3. Jika tidak, Ikiform me-redirect ke halaman terima kasih hosted-nya, yang menautkan kembali ke halaman Anda jika post datang dari halaman https di domain yang diizinkan.
Kecocokan pertama yang menang. _redirect yang gagal memenuhi aturan dilewati diam-diam; itu tidak pernah menjadi error.

Formulirnya

demo.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>

Tambahkan example.com di Allowed domains formulir dan formulir ini mengirim, mendapat 303, dan mendarat di /demo/next-step. Halaman terima kasih adalah HTML biasa di situs Anda:

demo/next-step.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 menjauhkannya dari hasil pencarian. Tidak ada yang seharusnya mendarat di sana dari Google, dan halaman terima kasih yang muncul sebagai halaman masuk di analytics adalah tanda ada yang menautkannya.
  • Refresh aman. Karena Ikiform menjawab dengan 303, browser memuat halaman ini dengan GET, dan memuat ulangnya tidak mengirim apa pun lagi.
  • Jika Anda menghitung konversi di halaman ini, hitung sekali per sesi. Refresh atau bookmark memuatnya ulang, dan dashboard Ikiform adalah hitungan yang sebenarnya.

Redirect ke situs lain

Misalkan Anda ingin melewati halaman Anda sendiri dan langsung mengirim orang ke alat booking di domain lain, seperti cal.example.com atau domain layanan penjadwalan. Dengan _redirect, domain itu harus ada di Allowed domains, dan daftar itu punya tugas kedua: menentukan situs mana yang boleh mengirim ke formulir. Menambahkan domain layanan penjadwalan berarti halaman di domain itu juga bisa mengirim ke formulir Anda.

Gunakan Redirect after submit di pengaturan formulir. Pengaturan ini menerima URL apa pun, karena hanya workspace Anda yang bisa mengaturnya, dan membuat Allowed domains hanya mencantumkan situs Anda sendiri.

Ikiform me-redirect ke URL persis seperti yang diberikan. Ikiform tidak menambahkan id kiriman atau nilai field apa pun, jadi halaman booking tidak bisa diisi otomatis dari redirect. Minta email lagi di sana, atau tautkan ke halaman booking dari halaman terima kasih Anda sendiri.

Halaman berbeda untuk formulir berbeda

Pengaturan dashboard berupa satu URL per formulir. Saat satu formulir muncul di beberapa halaman yang butuh halaman terima kasih berbeda, kosongkan pengaturan itu dan beri setiap halaman _redirect-nya sendiri. Halaman berbahasa Jerman mengirim pengunjung ke halaman terima kasih berbahasa Jerman:

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

Menambahkan nilai ke redirect

Query string di _redirect dipertahankan, jadi Anda bisa meneruskan pilihan pengunjung ke halaman terima kasih. Atur nilainya di listener submit, yang berjalan setelah validasi browser dan sebelum formulir di-encode:

demo.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;
});

Pengunjung tiba di /demo/next-step?size=11-50, dan halaman bisa menampilkan tautan booking yang tepat untuk ukuran tim itu. Batasi pada nilai yang tidak bersifat pribadi: query string tersimpan di riwayat browser, log server, dan analytics.

Redirect setelah submit dengan fetch

Panggilan fetch mendapat JSON, bukan redirect, jadi aturan redirect Ikiform tidak berlaku. Navigasikan sendiri saat jawabannya ok:

Redirect dari script
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");

Gunakan location.assign alih-alih location.replace jika tombol back seharusnya kembali ke formulir. Panduan tanpa reload berisi handler lengkap dengan error dan status loading.

Pastikan berfungsi

  1. Di Allowed domains formulir, tambahkan domain situs Anda, ditambah localhost selama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja.
  2. Kirim formulir dari halaman live Anda. Address bar menampilkan halaman terima kasih Anda, dan panel Network menunjukkan post dijawab dengan 303.
  3. Tekan refresh di halaman terima kasih. Browser tidak meminta kirim ulang, dan dashboard tetap menampilkan satu kiriman.
  4. Ubah _redirect ke alamat di domain yang tidak diizinkan lalu kirim. Anda mendarat di halaman terima kasih hosted milik Ikiform, tanpa error.
  5. Buka Submissions di dashboard. Kiriman baru ada di sana dengan setiap field yang Anda kirim.

Hal yang sering menjebak

MasalahPenyebab dan solusi
_redirect diabaikan meski domainnya diizinkanRedirect after submit diatur di pengaturan formulir, dan pengaturan itu selalu menang. Kosongkan untuk memakai redirect per halaman
Berfungsi di produksi, tidak di localhost_redirect harus https: tanpa port, jadi http://localhost:3000/thanks tidak pernah lolos. Uji di preview deploy, atau terima halaman hosted saat lokal
Halaman terima kasih hosted tidak punya tautan kembali ke situs AndaHalaman itu hanya menautkan kembali jika post datang dari halaman https: di salah satu domain yang diizinkan formulir. Tambahkan domainnya, atau redirect ke halaman Anda sendiri
Browser mendarat di halaman terima kasih Ikiform, bukan halaman Anda_redirect diabaikan kecuali domainnya ada di Allowed domains dan berupa URL https:. Tambahkan domainnya, atau atur Redirect after submit di pengaturan formulir sebagai gantinya.
Halaman terima kasih muncul di hasil pencarianTambahkan <meta name="robots" content="noindex"> ke halaman itu, dan jangan menautkannya dari navigasi Anda

Aturan persisnya, dengan contoh URL yang lolos dan gagal, ada di formulir HTML. Ringkasan menjelaskan mengapa jawabannya 303 dan bukan 302 atau 200.

Pertanyaan

Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.