Formulir kontak di situs statis

Formulir kontak di situs statis5 menit baca

Menambahkan formulir kontak ke website statis Amazon S3

Endpoint website S3 hanya menerima GET dan HEAD lewat HTTP biasa, jadi kirim formulir kontak ke form backend dan atur redirect dengan benar lewat CloudFront.

Preet SutharPendiri, Ikiform

Endpoint website S3 menjawab POST formulir dengan 405 MethodNotAllowed, jadi arahkan action formulir ke endpoint Ikiform Anda. Karena endpoint-nya http: biasa, _redirect kembali ke sana tidak pernah diikuti; atur Redirect after submit di pengaturan formulir, atau pasang CloudFront di depannya untuk https:. Dengan CloudFront di depan REST endpoint bucket, redirect ke nama file lengkap seperti thanks.html, karena default root object hanya berlaku untuk root.

Apa yang berbeda di S3

Bucket yang dikonfigurasi untuk static website hosting mendapat website endpoint sendiri, seperti http://www.example.com.s3-website-us-east-1.amazonaws.com. AWS mendokumentasikan bahwa endpoint ini hanya mendukung request GET dan HEAD pada objek. Kiriman formulir mendapat halaman error HTML:

Respons untuk POST
<html>
<head><title>405 Method Not Allowed</title></head>
<body>
<h1>405 Method Not Allowed</h1>
<ul>
<li>Code: MethodNotAllowed</li>
<li>Message: The specified method is not allowed against this resource.</li>
<li>Method: POST</li>
<li>ResourceType: OBJECT</li>

Tiga ciri S3 lainnya memengaruhi formulir kontak:

Ciri S3Artinya bagi formulir
Website endpoint tidak mendukung HTTPSIkiform hanya mengikuti _redirect ke URL https:, jadi redirect kembali ke endpoint polos diabaikan
Header respons berasal dari CloudFront, bukan bucketContent-Security-Policy diatur di response headers policy CloudFront
Default root object CloudFront hanya berlaku untuk rootDengan REST origin, https://example.com/thanks/ tidak memuat thanks/index.html; redirect ke thanks.html

Untuk situs https:, AWS merekomendasikan Amplify Hosting, yang berjalan di CloudFront, atau CloudFront di depan bucket. Formulir berfungsi dengan keduanya. Yang berubah adalah ke mana pengunjung berakhir setelah mengirim.

Ke mana pengunjung mendarat setelah mengirim, dengan dan tanpa CloudFrontwebsite endpoint S3 polos, httpCloudFront dan domain Anda, httpshttp://…s3-website…contact.htmlIkiformsimpan, kirim emailHalaman terimakasih Ikiform_redirect ke httpdiabaikanhttps://www.example.comcontact.htmlIkiformsimpan, kirim emailthanks.html Anda_redirect diikutiPOST303POST303Ke mana pengunjung mendarat setelah mengirim, dengan dan tanpa CloudFrontwebsite endpoint S3 polos, httpCloudFront dan domain Anda, httpshttp://…s3-website…contact.htmlIkiformsimpan, kirim emailHalaman terima kasihIkiform_redirect ke http diabaikanhttps://www.example.comcontact.htmlIkiformsimpan, kirim emailthanks.html Anda_redirect diikutiPOST303POST303
  1. Di website endpoint polos, halaman disajikan lewat http dan mengirim ke Ikiform.
  2. Ikiform menyimpan pesan, tetapi mengabaikan _redirect ke alamat http dan menampilkan halaman terima kasih hosted.
  3. Mengatur Redirect after submit di dashboard adalah jalan keluarnya, karena pengaturan itu menerima URL http.
  4. Di balik CloudFront dengan domain Anda sendiri, halaman memakai https.
  5. Ikiform mengikuti _redirect ke thanks.html Anda, selama domainnya ada di Allowed domains.
Pesan tetap disimpan bagaimanapun juga. Hanya langkah terakhir, ke mana browser pergi, yang bergantung pada https.

CloudFront origin yang mana

CloudFront bisa membaca dari bucket dengan dua cara, dan pilihannya menentukan bentuk URL terima kasih Anda:

OriginBucketHalaman index folderURL terima kasih
Website endpoint S3, sebagai custom originHarus bisa dibaca publikBerfungsi: /thanks/ memuat thanks/index.html/thanks/ atau /thanks.html
REST endpoint, dengan origin access controlTetap privat, hanya dibaca oleh CloudFrontHanya root, lewat default root object/thanks.html, nama file lengkap

Nama file lengkap berfungsi dengan keduanya, itulah sebabnya contoh-contohnya memakai itu. Jika Anda tidak ingin mengelola CloudFront sendiri, Amplify Hosting bisa deploy dari bucket dengan https: dan CDN terkelola; formulir juga tidak perlu diubah di sana.

Formulirnya

Situs S3 sering kali situs perusahaan, jadi formulir ini meminta email kantor dan nama perusahaan. Upload sebagai contact.html di samping thanks.html:

contact.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required />

  <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" />

  <label for="message">How can we help?</label>
  <textarea id="message" name="message" rows="6" minlength="10" required></textarea>

  <input type="hidden" name="_redirect" value="https://www.example.com/thanks.html" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button type="submit">Send</button>
</form>
  • _redirect mengarah ke domain CloudFront, dengan nama file. Redirect hanya diikuti jika www.example.com atau example.com ada di Allowed domains.
  • Di endpoint http: polos, hapus input _redirect dan atur Redirect after submit ke halaman terima kasih sebagai gantinya. Pengaturan itu menerima URL http:, karena hanya tim Anda yang bisa mengubahnya.
  • Pertahankan email sebagai nama field. Email notifikasi memakainya sebagai alamat reply-to.

Di situs perusahaan, biasanya lebih dari satu orang membaca inbox kontak. Tambahkan hingga 10 penerima notifikasi terkonfirmasi ke formulir; masing-masing menerima pesan, dan siapa pun yang menekan Reply langsung menjawab pengirim. Jika pesan juga perlu sampai ke channel bersama atau antrean tiket, tambahkan webhook bertanda tangan dan arahkan lewat Zapier atau kode Anda sendiri. Field company datang sebagai teks biasa, jadi siap difilter di kedua tempat.

Sebelum upload, uji halaman dari server lokal dengan localhost di Allowed domains. Kiriman dari localhost dihitung sebagai uji, jadi Anda bisa menyempurnakan formulir sebelum bucket menyajikannya.

Sinkronkan folder ke bucket, lalu invalidate halaman di CloudFront agar formulir baru langsung disajikan:

Terminal
aws s3 sync ./site s3://www.example.com --delete

aws cloudfront create-invalidation --distribution-id E1EXAMPLE --paths "/contact.html" "/thanks.html"

Domain yang diizinkan di host AWS

Tempat halaman disajikanTambahkan
Website endpoint polosHost endpoint lengkap bucket, seperti www.example.com.s3-website-us-east-1.amazonaws.com
Domain default CloudFrontHost d111111abcdef8.cloudfront.net persisnya, selama pengujian
Domain Anda sendiriexample.com, yang juga mencakup www.example.com

Jangan pernah menambahkan amazonaws.com, sufiks regional s3-website, atau cloudfront.net begitu saja. Setiap bucket atau distribusi di dunia akan cocok. AWS mendaftarkan domain website endpoint S3 di Public Suffix List untuk alasan yang sama: setiap bucket adalah situs terpisah.

Header lewat CloudFront

Metadata objek S3 tidak bisa mengatur Content-Security-Policy, jadi atur di response headers policy CloudFront dan pasang ke default cache behavior distribusi. Nilai header dibatasi 1.783 karakter:

csp-policy.json
{
  "Name": "site-csp",
  "SecurityHeadersConfig": {
    "ContentSecurityPolicy": {
      "Override": true,
      "ContentSecurityPolicy": "default-src 'self'; form-action 'self' https://ikiform.com; connect-src 'self' https://ikiform.com"
    }
  }
}
Terminal
aws cloudfront create-response-headers-policy --response-headers-policy-config file://csp-policy.json
Override: true menggantikan CSP apa pun yang dikirim origin. Dengan origin S3 polos memang tidak ada, tetapi ini menjaga policy tetap berlaku jika nanti Anda mengganti origin.

Pastikan berfungsi

  1. Tambahkan domain dari tabel di atas, ditambah localhost selama pengujian.
  2. Kirim dari domain CloudFront Anda. Anda seharusnya mendarat di thanks.html di domain Anda sendiri.
  3. Jika website endpoint polos juga tetap publik, kirim dari sana dan pastikan Anda sampai di halaman yang diatur di Redirect after submit.
  4. Buka Submissions di dashboard. Kiriman baru ada di sana dengan setiap field yang Anda kirim.
  5. Cek inbox setiap penerima notifikasi. Masing-masing mendapat email berisi field, dan Reply terkirim ke pengirim formulir jika formulir punya field email.
  6. Tidak ada yang masuk? Ubah filter status di dashboard ke Spam. Spam mendapat jawaban sukses yang sama dengan kiriman asli.

Hal yang sering menjebak

MasalahYang harus dilakukan
405 Method Not Allowed dengan Code: MethodNotAllowedFormulir mengirim ke bucket. CloudFront mungkin masih menyajikan contact.html lama; invalidate file itu.
AccessDenied atau 403 setelah redirectRedirect mengarah ke folder seperti /thanks/ di distribusi CloudFront dengan REST origin. Arahkan ke thanks.html.
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.
403 origin_not_allowed, atau setiap kiriman masuk ke spamDomain halaman tidak ada di Allowed domains formulir. Tambahkan, ditambah localhost untuk uji lokal. Subdomain dari domain yang terdaftar diizinkan.

Pertanyaan

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