Das HTML-Attribut action in Formularen teilt dem Browser mit, wohin die Formulardaten gesendet werden sollen, wenn ein Benutzer auf Absenden klickt. Es ist die URL, die die Formularübermittlung empfängt. Ohne dieses Attribut hat dein Formular keine Zieldestination. Der Unterschied zwischen einem Kontaktformular, das Nachrichten wirklich zustellt, und einem, das stillschweigend nichts tut, liegt genau hier.
Inhaltsverzeichnis
Was das action-Attribut wirklich tut
Wenn ein Benutzer ein Formular ausfüllt und auf Absenden klickt, packt der Browser alle Formulardaten in eine Anfrage und sendet sie an die URL, die im
action
Attribut angegeben ist. Diese URL wird als Formular-Endpoint bezeichnet. Der Server an diesem Endpoint empfängt die Daten, verarbeitet sie und sendet normalerweise eine Antwort zurück.
Hier ist das einfachste mögliche Beispiel:
<form action="https://example.com/submit" method="POST">
<input name="name" type="text"/>
<button type="submit">Send</button>
</form>
Wenn der Benutzer auf „Senden" klickt, sendet der Browser eine POST-Anfrage an
https://example.com/submit
mit den Formulardaten. Der Server an dieser Adresse kümmert sich um den Rest.
Wenn du das
action
Attribut ganz weglässt, sendet der Browser das Formular zurück zur aktuellen Seiten-URL. Das ist gelegentlich für serverseitig gerenderte Apps nützlich, aber in den meisten Fällen bedeutet es, dass deine Daten ins Leere gehen.
Was in die Formular-Action-URL gehört
Die Formular-Action-URL kann sein:
-
Eine absolute URL
wie
https://api.example.com/contact. Dies sendet Daten an einen völlig anderen Server oder Service. -
Eine relative URL
wie
/submitodersubmit.php. Der Browser löst diese gegen die Domain der aktuellen Seite auf. -
Ein leerer String
(
action=""). Sendet an die aktuelle Seite, genauso wie das Weglassen des Attributs.
Bei den meisten echten Kontaktformularen verwendest du eine absolute URL, die entweder auf dein eigenes serverseitiges Skript (eine PHP-Datei, einen Node.js-Endpoint usw.) oder einen Third-Party-Formular-Backend-Service verweist. Die Grundvoraussetzung ist, dass etwas an dieser URL läuft, um die Anfrage zu empfangen und zu verarbeiten.
action
URL ist das Ziel, nicht der Verarbeiter. Die eigentliche Arbeit (E-Mail versenden, in einer Datenbank speichern, einen Webhook auslösen) passiert in dem Code, der an diesem Endpoint läuft.
Warum method genauso wichtig ist wie action
Das
method
Attribut arbeitet zusammen mit
action
um zu definieren, wie die Daten gesendet werden. Es gibt zwei Optionen:
| Methode | Wie Daten gesendet werden | Typische Verwendung |
|---|---|---|
GET
|
An die URL als Query-Parameter angehängt (
?name=Alice&message=Hi
)
|
Suchformulare, Filter, speicherbare Abfragen |
POST
|
Im Request-Body gesendet, nicht in der URL sichtbar | Kontaktformulare, Login-Formulare, sensible oder lange Daten |
Bei Kontaktformularen verwendest du immer
method="POST"
. GET-Anfragen machen Feldwerte in der Browser-Adressleiste sichtbar, werden im Browser-Verlauf gespeichert und haben Längenbeschränkungen, die längere Nachrichten abschneiden. POST hat keine dieser Probleme.
Standardmäßig senden HTML-Formulare Daten als
application/x-www-form-urlencoded
, was Feldnamen und Werte in einen strukturierten String codiert. Die meisten Formular-Backends und Services akzeptieren dieses Format direkt.
Das Problem mit statischen Websites
Hier stoßen Entwickler auf eine Hürde. Wenn deine Website rein statisch ist (einfache HTML-Dateien gehostet auf GitHub Pages, Cloudflare Pages oder ähnlichen Hosting-Diensten), läuft auf deiner Domain kein serverseitiger Code. Du kannst deine Formular-Action nicht einfach auf ein PHP-Skript verweisen, weil es keine PHP-Runtime gibt, die es ausführen würde.
Das bedeutet, deine Formular-Action-URL muss auf etwas ganz anderes verweisen. Deine Optionen sind:
- Schreibe und hoste deine eigene Backend-API (Node.js, Python usw.) auf einem separaten Server
- Nutze eine serverlose Funktion (AWS Lambda, Cloudflare Workers)
- Nutze einen Formular-Backend-Service, der dir einen fertigen HTML-Formular-Endpoint gibt
Die dritte Option ist am schnellsten für die meisten Projekte. Du bekommst eine URL, die du direkt in dein
action
Attribut einfügen kannst, und Übermittlungen landen sofort in deinem Postfach, ohne dass du Backend-Code schreiben musst. Wenn du neugierig bist, wie das im Vergleich zum Schreiben eines eigenen serverseitigen Handlers aussieht, erklärt die
Übersicht PHP vs. serverlose Formulare
die Vor- und Nachteile deutlich.
Einen Formular-Endpoint-Service nutzen
Ein Formular-Endpoint-Service wie Sendform.net funktioniert, indem er dir eine eindeutige URL gibt, die als dein Formular-Action-Attribut dient. Du verweist dein Formular dorthin, und der Service leitet Übermittlungen an deine E-Mail weiter. Kein Backend nötig.
So sieht das in der Praxis aus:
<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>
Die Einrichtung ist unkompliziert:
- Melde dich bei Sendform.net an und erstelle ein Formular, um deine persönliche Endpoint-URL zu erhalten.
- Öffne den Reiter Integration und kopiere den Endpoint.
-
Füge ihn als
actionAttribut deines Formulars mitmethod="POST"ein. -
Stelle sicher, dass dein Formular ein
<input/>mitname="email"und einen<textarea> </textarea>mitname="message"hat. - Deploye deine Website. Übermittlungen landen sofort in deinem Benachrichtigungs-Postfach.
email
und
message
müssen exakt übereinstimmen. Wenn dein Feld
Email
(mit großem E) oder
msg
heißt, schlägt die Übermittlung fehl. Feldnamen sind Groß- und Kleinschreibung empfindlich.
Sendform hat auch einen Snippet Builder im Reiter Integration. Wähle „HTML" im Framework-Selector aus, stelle optional eine Redirect-URL für eine benutzerdefinierte Dankesseite ein und aktiviere ein Honeypot-Feld für grundlegenden Spam-Schutz. Es generiert den kompletten Formular-Snippet zum Kopieren.
Das formaction-Attribut auf Schaltflächen
Es gibt einen weniger bekannten Verwandten des Formular-Action-Attributs:
formaction
auf einzelnen Absenden-Schaltflächen. Es überschreibt das
action
des Formulars nur für diese spezifische Schaltfläche.
<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>
Wenn du auf „Speichern" klickst, werden Daten an
/default-endpoint
gesendet. Wenn du auf „Vorschau" klickst, werden dieselben Daten stattdessen an
/preview-endpoint
gesendet. Das
formaction
HTML-Attribut wird in allen modernen Browsern unterstützt und ist im
WHATWG HTML Living Standard definiert.
Das ist nützlich für Formulare mit mehreren Aktionen (speichern vs. veröffentlichen, speichern vs. löschen), ohne dass du JavaScript brauchst, um die Action des Formulars dynamisch zu wechseln.
Was nach dem Absenden passiert
Nachdem der Browser die Anfrage an die Formular-Action-URL sendet, bestimmt die Antwort des Servers, was der Benutzer als Nächstes sieht:
- Redirect-Antwort (HTTP 302/303): Der Server sendet den Browser zu einer neuen URL. Häufiges Muster zum Anzeigen einer „Danke"-Seite.
- HTML-Antwort: Der Server gibt eine Seite direkt zurück, die die aktuelle Seite im Browser ersetzt.
- Kein Redirect konfiguriert: Bei Sendform gibt der Service seine eigene Bestätigungsseite zurück, wenn du keine Redirect-URL eingestellt hast.
Wenn du möchtest, dass der Benutzer nach der Übermittlung auf deiner Website bleibt, konfiguriere eine Redirect-URL, die auf deine eigene Dankesseite verweist. In Sendform stellst du das im Snippet Builder oder in den Formulareinstellungen ein. Der Browser landet dann auf deiner Seite statt auf dem Standard-Bestätigungsbildschirm des Services.
Für Entwickler, die Übermittlungen ohne vollständiges Neuladen der Seite verarbeiten möchten, kannst du das Formular-Submit mit JavaScript abfangen, die Daten via
fetch()
senden und die Benutzeroberfläche selbst aktualisieren. In diesem Fall dient das
action
Attribut immer noch als nützlicher Fallback für Benutzer mit deaktiviertem JavaScript.
Häufige Fehler
- GET statt POST für Kontaktformulare verwenden. Feldwerte einschließlich E-Mail-Adressen landen in Server-Logs und Browser-Verlauf.
- Die Action auf eine statische Datei verweisen. HTML- und CSS-Dateien können Formularübermittlungen nicht verarbeiten. Die Action-URL braucht einen Server oder Service dahinter.
- Das Action-Attribut ganz vergessen. Das Formular sendet zur aktuellen Seite zurück, was normalerweise nur ein Neuladen ohne Effekt ist.
-
Feldnamen stimmen nicht überein.
Wenn der Endpoint
name="email"erwartet und dein Inputname="Email"hat, schlägt die Übermittlung auf der Server-Seite stillschweigend fehl. - Eine relative URL für einen Cross-Origin-Endpoint verwenden. Wenn dein Formular-Backend auf einer anderen Domain läuft, brauchst du die vollständige absolute URL inklusive Protokoll.
Für Webflow-Benutzer hat die Formular-Action-Einrichtung einige plattformspezifische Besonderheiten, die es wert sind, bekannt zu sein. Der Webflow-Kontaktformular-Leitfaden behandelt, wie man ein Webflow-Formular auf einen externen Endpoint verweist, ohne serverseitigen Code zu schreiben.
Bekomme eine echte HTML-Formular-Action-URL in unter einer Minute
Sendform.net gibt dir einen fertigen HTML-Formular-Endpoint, den du direkt in das Action-Attribut deines Formulars einfügen kannst. Kein Backend, kein JavaScript erforderlich. Verweise dein Formular auf deinen persönlichen Endpoint und Übermittlungen landen sofort in deinem Postfach.
Erstelle deinen Formular-Endpoint →
Wenn du das
action
Attribut weglässt oder auf einen leeren String setzt, sendet der Browser das Formular zur aktuellen Seiten-URL. Auf einer statischen HTML-Seite ohne serverseitigen Code lädt das normalerweise nur die Seite neu und verwirft die Daten komplett. Nichts wird gespeichert oder gemailt. Verweise
action
immer auf einen echten Endpoint, der die Übermittlung verarbeiten kann.
Ja. Du kannst das Submit-Event des Formulars mit JavaScript abfangen,
event.preventDefault()
aufrufen, Feldwerte mit
FormData
sammeln und sie via
fetch()
an die Action-URL senden. Das lässt dich eine Erfolgsmeldung zeigen, ohne die Seite zu verlassen. Das
action
Attribut funktioniert immer noch als zuverlässiger Fallback für Benutzer mit deaktiviertem JavaScript, also ist es gute Praxis, es sowieso korrekt eingestellt zu lassen.
Nein. Die Formular-Action-URL kann auf jede Domain verweisen. Eine traditionelle Formularübermittlung (nicht mit fetch) sendet die Anfrage direkt vom Browser und wird nicht durch die Same-Origin-Policy eingeschränkt, die für JavaScript-fetch-Anfragen gilt. Genau so funktionieren Formular-Backend-Services: Dein Formular lebt auf deiner Domain, aber die Action-URL verweist auf die Domain des Services, und der Browser sendet die Daten dorthin ohne CORS-Probleme.
Das
action
Attribut auf dem
<form>
</form>
Element setzt die Standard-Übermittlungs-URL für das ganze Formular. Das
formaction
Attribut auf einem einzelnen
<button type="submit">
</button>
oder
<input type="submit"/>
überschreibt diesen Standard nur für diese spezifische Schaltfläche. Wenn der Benutzer eine Schaltfläche mit
formaction
klickt, sendet das Formular zur URL dieser Schaltfläche statt zur Standard-URL des Formulars. Alle anderen Schaltflächen verwenden immer noch das Formular-Level
action
.
Die meisten Formular-Backend-Services, einschließlich Sendform.net, lassen dich eine Redirect-URL in deinen Formulareinstellungen konfigurieren. Nach einer erfolgreichen Übermittlung sendet der Service eine HTTP-Redirect-Antwort, die den Browser zu deiner gewählten URL lenkt, wie z.B.
/thank-you.html
. Ohne eine konfigurierte Redirect gibt der Service seine eigene Standard-Bestätigungsseite zurück. Stelle die Redirect im Snippet Builder oder im Formular-Einstellungs-Dashboard ein, bevor du dein Formular deployst.
Das passiert normalerweise, wenn die Formular-Action auf einen lokalen Server verweist (wie
http://localhost:3000/submit
), der in der Produktion nicht existiert. Nach dem Deployment ist diese Adresse unerreichbar. Stelle sicher, dass dein Action-Attribut eine absolute URL verwendet, die auf deinen Live-Endpoint verweist, nicht auf eine localhost-Adresse. Überprüfe auch, dass jede umgebungsspezifische Konfiguration (API-Schlüssel, Endpoint-URLs) auf deiner Hosting-Plattform korrekt eingestellt ist.