Блог
Как добавить контактную форму на Cloudflare Pages
· 3 мин чтения
Cloudflare Pages - быстрый и щедрый статический хостинг: запушили репозиторий, получили глобальный деплой, готово. Чего у него нет - так это аналога Netlify Forms: никакого встроенного сервиса, который сканирует ваш HTML в поисках тега <form> и начинает собирать отправки. Разверните обычную HTML-форму как есть на Cloudflare Pages - и POST-запрос уйдёт в никуда. Вот почему, и вот два способа это исправить.
Почему у Cloudflare Pages нет собственного продукта для форм
Cloudflare Pages - это хостинг статических файлов с опциональным слоем Functions для динамических маршрутов, а не платформа для обработки форм. Функция форм у Netlify работает за счёт анализа результата сборки при деплое и создания скрытого бэкенда для каждой найденной формы; Cloudflare Pages такого анализа не делает. Артефакты вашей сборки - это просто файлы на CDN. Если форме нужно куда-то отправлять данные, это «куда-то» придётся построить или одолжить самостоятельно. Вряд ли Cloudflare когда-нибудь закроет этот пробел - Pages намеренно ограничен статическими ресурсами плюс тонким serverless-слоем, а не конвейером для разбора форм.
Вариант 1: написать собственную Pages Function
Cloudflare Pages поддерживает Functions - небольшие обработчики в стиле Workers, которые лежат в каталоге /functions и выполняются на edge-инфраструктуре Cloudflare. Можно добавить functions/api/contact.ts, который читает тело POST-запроса, валидирует его, фильтрует спам, отправляет письмо (через API какого-нибудь провайдера, поскольку Workers не может устанавливать «сырые» SMTP-соединения), и, возможно, пишет данные в KV или D1 для хранения. Это работает, и всё остаётся в рамках одного проекта Cloudflare. Но теперь именно вы поддерживаете валидацию, фильтрацию спама, хранение и доставку писем - тот самый бэкенд, писать который статический хостинг должен был избавить вас от необходимости.
Вариант 2: направить форму на хостинговый бэкенд (рекомендуется)
Более быстрый путь - отправлять POST-запрос сервису, созданному именно для этого. Оставьте свою разметку, добавьте один атрибут:
<form action="https://formhook.app/f/YOUR_API_KEY" method="POST">
<input type="text" name="name" required />
<input type="email" name="email" required />
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>Это вся интеграция целиком. Никакой Function, никакого Worker, никаких ключей API для почты, которые нужно хранить. Отправки появляются в панели и могут запускать веб-push-уведомление - в том числе на iOS, если сайт добавлен на главный экран. Защита от спама включена по умолчанию: honeypot-поле и ограничение частоты запросов отсекают большую часть спама ещё до того, как он доберётся до вас, а для более целенаправленных атак можно добавить Cloudflare Turnstile - собственную приватность-ориентированную CAPTCHA Cloudflare, вполне уместную пару для формы, живущей на сайте Cloudflare Pages. Отправки и загруженные файлы хранятся на инфраструктуре в ЕС. Всё это не зависит от того, как построен остальной сайт: Astro, обычный HTML, статический экспорт Next.js, Hugo - чем бы ни генерировалась разметка, тег формы остаётся тем же самым, а деплой не меняется.
Как получить свой эндпоинт
- Зарегистрируйтесь и создайте форму в панели - карта не нужна.
- Скопируйте уникальный URL формы (он выглядит как
https://formhook.app/f/fh_xxxxxxxx). - Вставьте его в атрибут
actionвашей существующей<form>. - Закоммитьте и задеплойте как обычно.
Бесплатный тариф покрывает 250 отправок в месяц - этого достаточно для большинства контактных форм. Посмотрите страницу с тарифами, чтобы узнать, что даёт тариф Pro, если позже понадобятся загрузка файлов или подтверждённый домен отправки.
Рабочая форма в одну строку
Размещение в ЕС, отправки хранятся вечно, push-уведомления на любом тарифе.
Начать бесплатноБез банковской карты · читайте документацию
Читать дальше
- Альтернатива Netlify Forms: бэкенд форм, который работает где угодноNetlify Forms работает только если ваш сайт собирается и разворачивается на Netlify. Разбираем, что это требует, почему это привязывает ваши формы к хостингу, и как хостинг-независимый бэкенд форм решает эту проблему.
- Как добавить контактную форму на GitHub PagesGitHub Pages не выполняет серверный код, но контактную форму всё равно можно сделать. Сравниваем три подхода и даём решение на копипасте за одну минуту.
- Serverless-формы обратной связи: что «serverless» здесь реально значит«Serverless» используют для двух разных настроек формы обратной связи - функции, которую пишете вы, или бэкенда, который вы вообще не пишете. Вот в чём настоящее различие.