El atributo action de un formulario HTML le dice al navegador dónde enviar los datos cuando el usuario hace clic en enviar. Es la URL que recibe el formulario, y sin ella, tus datos no tienen adónde ir. Entender cómo funciona marca la diferencia entre un formulario de contacto que realmente entrega mensajes y uno que silenciosamente no hace nada.
Tabla de contenidos
Qué hace realmente el atributo action
Cuando un usuario completa un formulario y hace clic en enviar, el navegador empaqueta todos los valores de los campos en una solicitud y la envía a la URL especificada en el atributo
action
. Esa URL se llama endpoint del formulario. Cualquier servidor en ese endpoint recibe los datos, los procesa y típicamente devuelve una respuesta.
Aquí está el ejemplo más simple posible:
<form action="https://example.com/submit" method="POST">
<input name="name" type="text"/>
<button type="submit">Send</button>
</form>
Cuando el usuario hace clic en "Enviar", el navegador envía una solicitud POST a
https://example.com/submit
con los datos del formulario adjuntos. El servidor en esa dirección maneja el resto.
Si omites el atributo
action
completamente, el navegador envía el formulario de vuelta a la URL de la página actual. Eso es ocasionalmente útil para aplicaciones renderizadas en el servidor, pero para la mayoría de casos significa que tus datos no van a ningún lugar útil.
Qué va en la URL del formulario
La URL del formulario puede ser:
-
Una URL absoluta
como
https://api.example.com/contact. Esto envía datos a un servidor o servicio completamente diferente. -
Una URL relativa
como
/submitosubmit.php. El navegador la resuelve contra el dominio de la página actual. -
Una cadena vacía
(
action=""). Envía a la página actual, igual que omitir el atributo.
Para la mayoría de formularios de contacto del mundo real, usarás una URL absoluta que apunta a tu propio script del lado del servidor (un archivo PHP, un endpoint Node.js, etc.) o a un servicio de backend de formularios de terceros. El requisito clave es que algo tiene que estar ejecutándose en esa URL para recibir y procesar la solicitud.
action
es el destino, no el procesador. El trabajo real (enviar un email, guardar en una base de datos, activar un webhook) sucede en cualquier código que se ejecute en ese endpoint.
Por qué el método es tan importante como action
El atributo
method
funciona junto con
action
para definir cómo se envían los datos. Hay dos opciones:
| Método | Cómo se envían los datos | Uso típico |
|---|---|---|
GET
|
Se añaden a la URL como parámetros de consulta (
?name=Alice&message=Hi
)
|
Formularios de búsqueda, filtros, consultas que se pueden marcar |
POST
|
Se envían en el cuerpo de la solicitud, no visibles en la URL | Formularios de contacto, formularios de login, cualquier dato sensible o largo |
Para formularios de contacto, siempre usa
method="POST"
. Las solicitudes GET exponen los valores de los campos en la barra de direcciones del navegador, se almacenan en el historial del navegador y tienen límites de longitud que truncarán mensajes más largos. POST no tiene ninguno de esos problemas.
Por defecto, los formularios HTML envían datos como
application/x-www-form-urlencoded
, que codifica los nombres de los campos y valores en una cadena estructurada. La mayoría de backends de formularios y servicios aceptan este formato de forma inmediata.
El problema de los sitios estáticos
Aquí es donde los desarrolladores se encuentran con un obstáculo. Si tu sitio es puramente estático (archivos HTML simples alojados en GitHub Pages, Cloudflare Pages o similares), no hay código del lado del servidor ejecutándose en tu dominio. No puedes simplemente apuntar tu acción del formulario a un script PHP porque no hay un runtime de PHP para ejecutarlo.
Esto significa que tu URL de acción del formulario necesita apuntar a otro lugar completamente. Tus opciones son:
- Escribir y alojar tu propio backend API (Node.js, Python, etc.) en un servidor separado
- Usar una función serverless (AWS Lambda, Cloudflare Workers)
- Usar un servicio de backend de formularios que te proporcione un endpoint de formulario HTML listo para usar
La tercera opción es la más rápida para la mayoría de proyectos. Obtienes una URL para insertar directamente en tu atributo
action
y los envíos comienzan a llegar a tu bandeja de entrada sin código backend alguno. Si te interesa cómo se compara con escribir tu propio manejador del lado del servidor, el análisis de
PHP vs formularios serverless
cubre las compensaciones de forma clara.
Usar un servicio de endpoint de formulario
Un servicio de endpoint de formulario como Sendform.net funciona dándote una URL única que actúa como atributo action de tu formulario. Apuntas tu formulario allí, y el servicio reenvía los envíos a tu email. Sin backend necesario.
Así es como se ve en la práctica:
<form action="https://sendform.net/en/!a8Kz3mXq12" method="POST">
<input name="email" placeholder="[email protected]" required="" type="email"/>
<textarea name="message" placeholder="Tell us more" required=""></textarea>
<button type="submit">Send</button>
</form>
La configuración es sencilla:
- Inicia sesión en Sendform.net y crea un formulario para obtener tu URL de endpoint personal.
- Abre la pestaña de Integración y copia el endpoint.
-
Pégalo como atributo
actionde tu formulario conmethod="POST". -
Asegúrate de que tu formulario tenga un
<input/>conname="email"y un<textarea> </textarea>conname="message". - Despliega tu sitio. Los envíos llegan a tu bandeja de notificaciones.
email
y
message
deben coincidir exactamente. Si tu campo se llama
Email
(E mayúscula) o
msg
, la validación del envío fallará. Los nombres de los campos son sensibles a mayúsculas.
Sendform también tiene un Generador de Fragmentos en la pestaña de Integración. Selecciona "HTML" del selector de framework, opcionalmente establece una URL de redirección para una página de agradecimiento personalizada, y activa un campo honeypot para protección básica contra spam. Genera el fragmento de formulario completo listo para copiar.
El atributo formaction en botones
Hay un primo menos conocido del atributo action del formulario:
formaction
en botones de envío individuales. Anula el
action
del formulario solo para ese botón específico.
<form action="/default-endpoint" method="POST">
<input name="query" type="text">
<button type="submit">Save</button>
<button formaction="/preview-endpoint" type="submit">Preview</button>
</input></form>
Hacer clic en "Guardar" envía datos a
/default-endpoint
. Hacer clic en "Vista previa" envía los mismos datos a
/preview-endpoint
en su lugar. El atributo HTML
formaction
es compatible en todos los navegadores modernos y está definido en el
estándar vivo HTML de WHATWG.
Esto es útil para formularios con múltiples acciones (guardar vs. publicar, guardar vs. eliminar) sin necesidad de JavaScript para cambiar dinámicamente la acción del formulario.
Qué sucede después de enviar
Después de que el navegador envía la solicitud a la URL de acción del formulario, la respuesta del servidor determina qué ve el usuario a continuación:
- Respuesta de redirección (HTTP 302/303): El servidor envía el navegador a una URL nueva. Patrón común para mostrar una página de "gracias".
- Respuesta HTML: El servidor devuelve una página directamente, que reemplaza la página actual en el navegador.
- Sin redirección configurada: Con Sendform, si no has establecido una URL de redirección, el servicio devuelve su propia página de confirmación.
Si quieres mantener al usuario en tu propio sitio después del envío, configura una URL de redirección que apunte a tu propia página de agradecimiento. En Sendform, estableces esto en el Generador de Fragmentos o en la configuración del formulario. El navegador aterrizará en tu página en lugar de la pantalla de confirmación predeterminada del servicio.
Para desarrolladores que quieren manejar envíos sin una recarga de página completa, puedes interceptar el envío del formulario con JavaScript, enviar los datos vía
fetch()
, y actualizar la interfaz tú mismo. En ese caso, el atributo
action
sigue siendo un fallback útil para usuarios con JavaScript deshabilitado.
Errores comunes
- Usar GET en lugar de POST para formularios de contacto. Los valores de los campos, incluyendo direcciones de email, terminan en registros del servidor e historial del navegador.
- Apuntar la acción a un archivo estático. Los archivos HTML y CSS no pueden procesar envíos de formularios. La URL de acción necesita un servidor o servicio detrás.
- Olvidar el atributo action completamente. El formulario se envía de vuelta a la página actual, que usualmente solo se recarga sin efecto alguno.
-
Nombres de campos no coincidentes.
Si el endpoint espera
name="email"y tu input tienename="Email", la validación del envío falla silenciosamente en el lado del servidor. - Usar una URL relativa para un endpoint de origen cruzado. Si tu backend de formulario vive en un dominio diferente, necesitas la URL absoluta completa incluyendo el protocolo.
Para usuarios de Webflow específicamente, la configuración de acción del formulario tiene algunos inconvenientes específicos de la plataforma que vale la pena conocer. La guía de formulario de contacto de Webflow cubre cómo apuntar un formulario de Webflow a un endpoint externo sin escribir código del lado del servidor.
Obtén una URL de acción de formulario HTML real en menos de un minuto
Sendform.net te proporciona un endpoint de formulario HTML listo para usar que puedes insertar directamente en el atributo action de tu formulario. Sin backend, sin JavaScript requerido. Apunta tu formulario de sitio estático a tu endpoint personal y los envíos llegan a tu bandeja de entrada al instante.
Crear tu endpoint de formulario →
Si omites el atributo
action
o lo estableces como una cadena vacía, el navegador envía el formulario a la URL de la página actual. En una página HTML estática sin código del lado del servidor, esto usualmente solo recarga la página y descarta los datos completamente. Nada se guarda o se envía por email. Siempre apunta
action
a un endpoint real que pueda procesar el envío.
Sí. Puedes interceptar el evento submit del formulario con JavaScript, llamar a
event.preventDefault()
, recopilar los valores de los campos usando
FormData
, y enviarlos a la URL de action vía
fetch()
. Esto te permite mostrar un mensaje de éxito sin navegar fuera. El atributo
action
sigue actuando como un fallback confiable para usuarios con JavaScript deshabilitado, así que es buena práctica mantenerlo configurado correctamente de todas formas.
No. La URL de acción del formulario puede apuntar a cualquier dominio. Un envío de formulario tradicional (sin usar fetch) envía la solicitud directamente desde el navegador y no está restringido por la política de mismo origen que se aplica a las solicitudes fetch de JavaScript. Esto es exactamente cómo funcionan los servicios de backend de formularios: tu formulario vive en tu dominio, pero la URL de action apunta al dominio del servicio, y el navegador envía los datos allí sin problemas de CORS.
El atributo
action
en el elemento
<form>
</form>
establece la URL de envío predeterminada para todo el formulario. El atributo
formaction
en un
<button type="submit">
</button>
o
<input type="submit"/>
individual anula ese predeterminado solo para ese botón específico. Cuando el usuario hace clic en un botón con
formaction
, el formulario se envía a la URL de ese botón en lugar del
action
predeterminado del formulario.
La mayoría de servicios de backend de formularios, incluyendo Sendform.net, te permiten configurar una URL de redirección en la configuración de tu formulario. Después de un envío exitoso, el servicio envía una respuesta de redirección HTTP que apunta el navegador a tu URL elegida, como
/thank-you.html
. Sin una redirección configurada, el servicio devuelve su propia página de confirmación predeterminada. Establece la redirección en el Generador de Fragmentos o en el panel de configuración del formulario antes de desplegar tu formulario.
Esto usualmente sucede cuando la acción del formulario apunta a un servidor local (como
http://localhost:3000/submit
) que no existe en producción. Después del despliegue, esa dirección es inalcanzable. Asegúrate de que tu atributo action use una URL absoluta que apunte a tu endpoint activo, no una dirección localhost. También verifica dos veces que cualquier configuración específica del ambiente (claves API, URLs de endpoint) esté correctamente establecida en tu plataforma de hosting.